ville bare fortælle dig, at du kan bruge variabler i MySQL til at efterligne analytiske funktioner. SUM OVER kunne for eksempel gøres på følgende måde:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Hvis du ønsker at PARTITION BY , det er muligt, men bare lidt mere kompliceret. Grundlæggende tilføjer du en anden @variable for at se kontoen (eller hvad du nu vil opdele efter), bestil efter konto (eller din variabel), og nulstil derefter @sum når kontoen ændres. Som følger:
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
Du vil bemærke to store ændringer, der skulle gøres for at opnå partitionseffekten:
-
Hovedtabellen (
tbl) er indkapslet i et undervalg med enORDER BYklausul. Dette er nødvendigt, fordi når MySQL går til at gøre@accountvariabel testning, skal værdierne allerede være bestilt. Hvis dette ikke skete, ville du få forkerte sumværdier såvel som kontoværdier. -
Der er en "ekstra" kolonne kaldet
as _. Du kan ignorere denne kolonne, når du bruger resultater, men rækkefølgen af @accountcheck og ændring skal være efter@sumkontrollere og ændre.Også med dette kunne du vælge at omarrangere dine kolonner, hvis du ikke havde noget imod, at kontoen var sidst. Dette gøres ved at tage den første
accountud kolonne, da den dubleres med den sidste_kolonne og derefter åbenbart omdøbt aliasset_tilaccount.
Ressourcer:
- https://dev.mysql.com/ doc/refman/5.0/da/user-variables.html
- https://stackoverflow.com/a/2563940/263175