#window-functions #mysql-5.7
#окно-функции #mysql-5.7
Вопрос:
У меня есть следующие данные:
--------- -------- ---------- ------ ------- -------- -----------
| xType | xAccID | xAccName | xCat | xYear | xMonth | xRaseed |
--------- -------- ---------- ------ ------- -------- -----------
| Amounts | 52 | Acc1 | Rs | 2020 | 11 | 3144.83 |
| Amounts | 52 | Acc1 | Rs | 2020 | 12 | -15199.64 |
| Amounts | 53 | Acc2 | Cus | 2020 | 12 | 5306.04 |
| Amounts | 53 | Acc2 | Cus | 2020 | 11 | 1090.64 |
--------- -------- ---------- ------ ------- -------- -----------
на самом деле, я хочу суммировать (xRaseed) в текущей строке с (xRaseed) в предыдущей строке для каждого (xAccID) отдельно
результат, который я хочу:
--------- -------- ---------- ------ ------- -------- --------------------------------
| xType | xAccID | xAccName | xCat | xYear | xMonth | xRaseed |
--------- -------- ---------- ------ ------- -------- --------------------------------
| Amounts | 52 | Acc1 | Rs | 2020 | 11 | 3144.83 |
| Amounts | 52 | Acc1 | Rs | 2020 | 12 | Not -15199.64 But (-12,054.81) |
| Amounts | 53 | Acc2 | Cus | 2020 | 12 | 5306.04 |
| Amounts | 53 | Acc2 | Cus | 2020 | 11 | Not 1090.64 But (6,396.68) |
--------- -------- ---------- ------ ------- -------- --------------------------------
Я применил следующее решение, которое я получил от кого-то здесь:
select t.*,
sum(xRaseed) over (partition by xAccID order by xYear, xMonth) as running_xRaseed
from t;
но все работало на локальном сервере, но когда я применил решение на своем хостинге, не сработало?? в локальном я использую (xampp — 10.4.17-MariaDB), а на моем хостинге я использую (MySQL 5.7.23-23), в чем проблема, пожалуйста?
Вот db<>скрипка
Комментарии:
1. Либо используйте определяемую пользователем переменную и эмулируйте ROW_NUMBER (требуется 2 копии таблицы), либо используйте 3 копии таблицы (2 соединенных 3-я в НЕ СУЩЕСТВУЕТ), чтобы найти соседнюю строку.
Ответ №1:
В версиях MySQL более ранних, чем 8 , мы можем использовать коррелированный подзапрос для нахождения скользящей суммы:
SELECT xType, xAccID, xAccName, xCat, xYear, xMonth,
(SELECT SUM(t2.xRaseed) FROM yourTable t2
WHERE t2.xAccID = t1.xAccID AND
(t2.xYear < t1.xYear OR
t2.xYear = t1.xYear AND t2.xMonth <= t1.xMonth)) AS xRaseed
FROM yourTable t1
ORDER BY
xAccId,
xYear,
xMonth;