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 BYklausul. Detta är nödvändigt eftersom när MySQL går till@accountvariabeltestning 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å@accountkontroll och ändring måste ske efter@sumkontrollera 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
accountkolumnen eftersom den dupliceras med den sista_kolumnen och döpte sedan uppenbarligen om den aliasade_tillaccount.
Resurser:
- https://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175