ville bara berätta att du kan använda variabler i MySQL för att efterlikna analytiska funktioner. SUM OVER, till exempel, kan göras på följande sätt:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Om du vill PARTITION BY
, det är möjligt men bara lite mer komplicerat. I grund och botten lägger du till en annan @variable
för att titta på kontot (eller vad du vill partitionera efter), beställ efter konto (eller din variabel) och återställ sedan @sum
när kontot ändras. Så här:
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 kommer att notera två stora förändringar som måste göras för att uppnå partitionseffekten:
-
Huvudtabellen (
tbl
) är inkapslad i ett underval med enORDER BY
klausul. Detta är nödvändigt eftersom när MySQL går till@account
variabeltestning måste värdena redan vara beställda. Om detta inte hände skulle du få felaktiga summavärden såväl som kontovärden. -
Det finns en "extra" kolumn med alias
as _
. Du kan ignorera den här kolumnen när du använder resultat, men ordningen på@account
kontroll och ändring måste ske efter@sum
kontrollera och ändra.Också med detta kan du välja att ändra ordningen på dina kolumner om du inte hade något emot kontot som sist. Detta görs genom att ta ut det första
account
kolumnen eftersom den dupliceras med den sista_
kolumnen och döpte sedan uppenbarligen om den aliasade_
tillaccount
.
Resurser:
- http://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175