solo quería decirle que puede usar variables en MySQL para imitar funciones analíticas. SUM OVER, por ejemplo, podría hacerse de la siguiente manera:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Si desea PARTITION BY
, es posible pero un poco más complicado. Básicamente, agrega otro @variable
para ver la cuenta (o lo que sea por lo que quiera particionar), ordenar por cuenta (o su variable) y luego restablecer el @sum
cuando la cuenta cambia. De la siguiente manera:
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
Notará dos cambios importantes que se tuvieron que hacer para lograr el efecto de partición:
-
La tabla principal (
tbl
) está encerrado en una subselección con unORDER BY
cláusula. Esto es necesario porque cuando MySQL va a hacer@account
prueba de variables, los valores ya deben estar ordenados. Si esto no sucediera, obtendría valores de suma incorrectos, así como valores de cuenta. -
Hay una columna 'extra' con alias
as _
. Puede ignorar esta columna cuando use resultados, pero el orden de@account
verificar y cambiar debe estar después de@sum
comprobar y cambiar.También con esto, puede elegir reordenar sus columnas si no le importa que la cuenta sea la última. Esto se hace sacando la primera
account
columna ya que se duplica con el último_
columna y luego, obviamente, cambió el nombre del alias_
aaccount
.
Recursos:
- http://dev.mysql.com/ doc/refman/5.0/es/variables-de-usuario.html
- https://stackoverflow.com/a/2563940/263175