Можем ли мы сгруппировать сумму за предыдущий период в SQL - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно сгруппировать сумму из предыдущего периода в SQL.Вот мои данные от упрощенного клиента (клиента A, B и C)

Customer      Year     Month    Order
A             2019         5       10 
A             2019         4        5
A             2019         3        3
A             2019         2        1 
A             2018        12        3
B             2019         5        1
B             2019         4        2
B             2019         3        1
C             2019         5        2
C             2019         4        1
C             2019         2        1
C             2019         1        3

Ожидаемый результат - сумма заказа за предыдущий период

Например, ожидаемый результат в первой строке равен 12, потому чтоэто сумма в предыдущем периоде (7 + 4 + 3 + 0) для клиента A.

Другой пример: ожидаемый результат во второй строке равен 7, потому что это сумма в предыдущем периоде (4 + 3 + 0) для клиента AТаким образом, таблица ниже - это ожидаемый результат из таблицы выше

Customer      Year     Month    Order    Output
A             2019         5       10        12
A             2019         4        5         7
A             2019         3        3         4
A             2019         2        1         3
A             2018        12        3         0
B             2019         5        1         3
B             2019         4        2         1
B             2019         3        1         0
C             2019         5        2         5
C             2019         4        1         4
C             2019         2        1         3
C             2019         1        3         0

Мне нужно сделать это в SQL

Ответы [ 3 ]

1 голос
/ 19 июня 2019

В MySQL 8+ вы должны использовать оконные функции:

select t.*,
       sum(output) over (partition by customer order by year, month)
from t;

Обратите внимание, что это более лаконично, но также должно иметь лучшую производительность.

1 голос
/ 19 июня 2019

Этого можно достичь с помощью оконных функций. Ниже ссылка предоставляет пример

LAG ([, offset [, default_value]]) OVER ( PARTITION BY expr, ... ЗАКАЗАТЬ по expr [ASC | DESC], ... )

http://www.mysqltutorial.org/mysql-window-functions/mysql-lag-function/

1 голос
/ 19 июня 2019

Прежде всего, я бы изменил имя ваших столбцов (год, месяц и порядок - зарезервированные слова или функции mysql). Вы можете сделать это с помощью такого подзапроса:

select customer, 
       `year`, 
       `month`, 
       `order`, 
        (select sum(output)
         from yourtable b 
         where a.customer=b.customer and (a.year>b.year or (a.year=b.year and a.month>b.month)))
from yourtable a

Что вы делаете, так это то, что вы получаете каждую строку, а последний столбец представляет собой сумму выходных данных для всех других столбцов с тем же клиентом, у которых год меньше, чем у вашего клиента, или, если год совпадает, месяц меньше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...