как решить проблему с запуском кода для MySQL8 в MySQL 5.7?

#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;