просто исках да ви кажа, че можете да използвате променливи в MySQL, за да имитирате аналитични функции. SUM OVER, например, може да се направи по следния начин:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Ако искате да PARTITION BY
, възможно е, но е малко по-сложно. По принцип добавяте още един @variable
за да гледате акаунта (или каквото искате да разделите), подредете по акаунт (или вашата променлива) и след това нулирайте @sum
когато акаунтът се промени. Както следва:
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
Ще забележите две основни промени, които трябваше да се направят, за да се постигне ефектът на дяла:
-
Основната таблица (
tbl
) е обвито в подизбиране сORDER BY
клауза. Това е необходимо, защото когато MySQL отиде да направи@account
тестване на променлива, стойностите вече трябва да бъдат поръчани. Ако това не се случи, ще получите неправилни стойности на сумата, както и стойности на акаунта. -
Има „допълнителна“ колона с псевдоним
as _
. Можете да игнорирате тази колона, когато използвате резултати, но реда на@account
проверката и промяната трябва да са след@sum
проверете и сменете.Освен това с това можете да изберете да пренаредите колоните си, ако нямате нищо против акаунтът да е последен. Това става чрез премахване на първия
account
колона, тъй като се дублира с последния_
колона и след това очевидно преименува псевдонима_
къмaccount
.
Ресурси:
- http://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175