jen jsem vám chtěl říct, že můžete použít proměnné v MySQL k napodobení analytických funkcí. SUM OVER lze například provést následovně:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Pokud chcete PARTITION BY
, je to možné, ale jen trochu složitější. V podstatě přidáte další @variable
sledovat účet (nebo cokoli, podle čeho chcete rozdělit), seřadit podle účtu (nebo své proměnné) a poté resetovat @sum
při změně účtu. Takto:
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
Všimněte si dvou hlavních změn, které bylo nutné provést, aby se dosáhlo efektu rozdělení:
-
Hlavní tabulka (
tbl
) je uzavřena v dílčím výběru sORDER BY
doložka. To je nutné, protože když MySQL přejde k provedení@account
testování proměnných hodnoty je třeba již objednat. Pokud by se tak nestalo, dostali byste nesprávné hodnoty součtů i hodnoty účtu. -
Existuje sloupec 'extra' s aliasem
as _
. Tento sloupec můžete při používání výsledků ignorovat, ale pořadí@account
kontrola a změna musí být za@sum
zkontrolovat a změnit.Také se můžete rozhodnout změnit pořadí sloupců, pokud vám nevadilo, že účet je poslední. To se provede odebráním prvního
account
protože se duplikuje s posledním_
a poté zjevně přejmenoval alias_
naaccount
.
Zdroje:
- http://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175