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 BY
klausul. Dette er nødvendigt, fordi når MySQL går til at gøre@account
variabel 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 @account
check og ændring skal være efter@sum
kontrollere 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
account
ud kolonne, da den dubleres med den sidste_
kolonne og derefter åbenbart omdøbt aliasset_
tilaccount
.
Ressourcer:
- http://dev.mysql.com/ doc/refman/5.0/da/user-variables.html
- https://stackoverflow.com/a/2563940/263175