volevo solo dirti che puoi usare le variabili in MySQL per imitare le funzioni analitiche. SUM OVER, ad esempio, potrebbe essere fatto come segue:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Se vuoi PARTITION BY
, è possibile ma solo un po' più complicato. Fondamentalmente, aggiungi un altro @variable
per guardare l'account (o qualunque cosa tu voglia partizionare), ordinare per account (o la tua variabile), e quindi reimpostare il @sum
quando l'account cambia. Come segue:
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
Noterai due importanti modifiche che è stato necessario apportare per ottenere l'effetto di partizione:
-
La tabella principale (
tbl
) è racchiuso in un sub select con unORDER BY
clausola. Questo è necessario perché quando MySQL va a fare il@account
test delle variabili i valori devono essere già ordinati. Se ciò non accadesse, otterresti valori di somma errati e valori dell'account. -
C'è una colonna "extra" alias
as _
. Puoi ignorare questa colonna quando utilizzi i risultati, ma l'ordine del@account
il controllo e la modifica devono essere dopo il@sum
controlla e cambia.Inoltre, con questo, potresti scegliere di riordinare le tue colonne se non ti dispiaceva essere l'ultimo. Questo viene fatto eliminando il primo
account
colonna poiché si duplica con l'ultimo_
colonna e poi ovviamente rinominato l'alias_
aaccount
.
Risorse:
- http://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175