chciałem tylko powiedzieć, że w MySQL można używać zmiennych do naśladowania funkcji analitycznych. Na przykład SUM OVER można wykonać w następujący sposób:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Jeśli chcesz PARTITION BY , jest to możliwe, ale tylko trochę bardziej skomplikowane. Zasadniczo dodajesz kolejną @variable aby obejrzeć konto (lub cokolwiek, według którego chcesz podzielić), uporządkuj według konta (lub swojej zmiennej), a następnie zresetuj @sum gdy konto się zmieni. W następujący sposób:
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
Zauważysz dwie główne zmiany, które musiały zostać wprowadzone, aby uzyskać efekt partycji:
-
Główna tabela (
tbl) jest umieszczony w podmenu zORDER BYklauzula. Jest to konieczne, ponieważ kiedy MySQL przechodzi do@accounttestowanie zmiennych wartości muszą być już zamówione. Jeśli tak się nie stanie, otrzymasz nieprawidłowe wartości sum, a także wartości konta. -
Istnieje „dodatkowa” kolumna o aliasie
as _. Możesz zignorować tę kolumnę podczas korzystania z wyników, ale kolejność@accountsprawdź i zmień musi być po@sumsprawdź i zmień.Również dzięki temu możesz zmienić kolejność kolumn, jeśli nie masz nic przeciwko temu, aby konto było ostatnie. Odbywa się to poprzez wyjęcie pierwszego
accountkolumna, ponieważ duplikuje się z ostatnim_kolumna, a następnie oczywiście zmieniono nazwę na alias_naaccount.
Zasoby:
- https://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175