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 BY
klauzula. Jest to konieczne, ponieważ kiedy MySQL przechodzi do@account
testowanie 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ść@account
sprawdź i zmień musi być po@sum
sprawdź 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
account
kolumna, ponieważ duplikuje się z ostatnim_
kolumna, a następnie oczywiście zmieniono nazwę na alias_
naaccount
.
Zasoby:
- http://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175