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 BYdoložka. To je nutné, protože když MySQL přejde k provedení@accounttestová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í@accountkontrola a změna musí být za@sumzkontrolovat 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
accountprotože se duplikuje s posledním_a poté zjevně přejmenoval alias_naaccount.
Zdroje:
- https://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175