Ik wilde je alleen vertellen dat je variabelen in MySQL kunt gebruiken om analytische functies na te bootsen. SUM OVER kan bijvoorbeeld als volgt worden gedaan:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Als u wilt PARTITION BY
, het is mogelijk, maar net iets ingewikkelder. Kortom, je voegt nog een @variable
toe om het account te bekijken (of waar u ook op wilt partitioneren), sorteer op account (of uw variabele) en reset vervolgens de @sum
wanneer de rekening verandert. Als volgt:
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
Je zult twee belangrijke veranderingen opmerken die gedaan moesten worden om het partitie-effect te bereiken:
-
De hoofdtabel (
tbl
) is ingekapseld in een subselectie met eenORDER BY
clausule. Dit is nodig omdat wanneer MySQL het@account
. gaat doen variabele testen de waarden moeten al besteld zijn. Als dit niet is gebeurd, krijgt u onjuiste somwaarden en accountwaarden. -
Er is een 'extra' kolom met de alias
as _
. U kunt deze kolom negeren bij het gebruik van resultaten, maar de volgorde van het@account
controleren en wijzigen moet na de@sum
. zijn controleren en wijzigen.Ook hiermee kunt u ervoor kiezen om uw kolommen opnieuw te ordenen als u het niet erg vindt dat uw account de laatste is. Dit doe je door het eerste
account
. af te sluiten kolom omdat deze dupliceert met de laatste_
kolom en vervolgens hernoemd uiteraard de alias_
naaraccount
.
Bronnen:
- http://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175