só queria dizer que você pode usar variáveis no MySQL para imitar funções analíticas. SUM OVER, por exemplo, pode ser feito da seguinte forma:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Se você deseja
PARTITION BY
, é possível, mas um pouco mais complicado. Basicamente, você adiciona outro @variable
para assistir a conta (ou o que você deseja particionar), ordene por conta (ou sua variável) e, em seguida, redefina o @sum
quando a conta muda. Do seguinte modo:
SELECT account,
amount,
(case when @account != account then @sum := amount else @sum := @sum + amount end) as sum,
(case when @account != account then @account := account else @account end) as _
FROM (SELECT * FROM tbl ORDER BY account)
JOIN (SELECT @sum := 0) s
JOIN (SELECT @account := '') a
Você notará duas grandes mudanças que tiveram que ser feitas para realizar o efeito de partição:
-
A tabela principal (tbl
) está envolto em um sub select com umORDER BY
cláusula. Isso é necessário porque quando o MySQL vai fazer o@account
variável testando os valores precisam já estar ordenados. Se isso não acontecesse, você obteria valores de soma incorretos, bem como valores de conta.
-
Existe uma coluna 'extra' com o aliasas _
. Você pode ignorar esta coluna ao usar resultados, mas a ordem do@account
check and change precisa estar após o@sum
verifique e altere.
Além disso, você pode optar por reordenar suas colunas se não se importar que a conta seja a última. Isso é feito retirando a primeiraaccount
coluna, pois duplica com o último_
coluna e, em seguida, obviamente renomeou o alias_
paraaccount
.
Recursos:
- http://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175