скользящая сумма за 3 месяца и количество строк из нерегулярно датированного набора в SQL - PullRequest
1 голос
/ 11 октября 2019

Можно ли получить скользящую 3-месячную сумму (значение) каждого идентификатора?

Данные:

+--------------------+---------------+----------------+---------------+
| tiq_transaction_id | id            | date           | value         |
+--------------------+---------------+----------------+---------------+
|           23980806 | a             | 2018-05-15     | 73614336.7168 |
|           24957628 | a             | 2018-09-28     | 47859499.2648 |
|           25403113 | a             | 2018-11-23     | 40708340.1377 |
|           25771232 | a             | 2019-01-07     | 15180519.2423 |
|           23455679 | b             | 2018-02-27     | 21032280.0296 |
|           24456317 | b             | 2018-07-25     | 8081544.0407  |
|           22963119 | c             | 2017-12-01     | 7570269.5457  |
|           22962927 | c             | 2017-12-04     | 8632491.8602  |
|           22962741 | c             | 2017-12-05     | 7029459.0614  |
|           22982978 | c             | 2017-12-06     | 5147303.2     |
|           22982751 | c             | 2017-12-07     | 7667280.7413  |
|           22982520 | c             | 2017-12-08     | 10090265.727  |
|           23007107 | c             | 2017-12-11     | 4930930.2813  |
+--------------------+---------------+----------------+---------------+

Ответы [ 2 ]

1 голос
/ 11 октября 2019

В стандартном SQL вы можете использовать оконные функции вместе с определением интервала:

select id, 
       date,
       value,
       sum(value) over (partition by id 
                        order by date 
                          range between '3 month' preceding and current row) as running_sum 
from the_table   
order by id, date;

Онлайн пример (с использованием Postgres)

0 голосов
/ 11 октября 2019

Вот ваш запрос. (Применимо для MS SQL Server)

  1. Получите ваш yyyyMM dateadd(month, datediff(month, 0, [date]), 0)
  2. используйте sum over ваши данные за 3 месяца на основе yyyyMM
  3. затем group by id
select id, dateadd(month, datediff(month, 0, [date]), 0) as yyyymm
        ,sum(sum([value])) over 
            (partition by id order by 
                dateadd(month, datediff(month, 0, [date]), 0) 
                    rows between 2 preceding and current row) as Rolling3Months
from test
group by id,  dateadd(month, datediff(month, 0, [date]), 0)
order by id, yyyymm

Попробуйте SQLFIDDLE

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