Нахождение разницы в день от предыдущей записи и разбиение по категориям - PullRequest
0 голосов
/ 24 октября 2018

У меня есть следующая таблица:

+----------+------------+----------------+
| Customer |    Date    | DesiredDayDiff |
+----------+------------+----------------+
| aaa      | 12/09/2018 |              0 |
| aaa      | 18/09/2018 |              6 |
| aaa      | 25/09/2018 |             13 |
| aaa      | 27/09/2018 |             15 |
| aaa      | 28/09/2018 |             16 |
| bbb      | 07/09/2018 |              0 |
| bbb      | 11/09/2018 |              4 |
| bbb      | 11/09/2018 |              4 |
+----------+------------+----------------+

Мне нужно рассчитать разницу дня от предыдущей записи для этого конкретного клиента.

Я полагаю, что в SQL Server 2012+ добавлена ​​функциональность, которая позволяет выполнять какие-то функции окна ??Если это можно сделать с помощью оконной функции, это будет бонусом, который, как мы надеемся, позволит моему запросу быть намного более аккуратным.

Я не смог найти аналогичную ветку, где решение делится на другие категории.(в данном случае это клиент)

1 Ответ

0 голосов
/ 24 октября 2018

Если я последую вашему повествованию и разногласиям из предыдущего ряда, то для этого будет работать LAG:

declare @t table (Customer char(3), Date date, DesiredDayDiff int)
insert into @t(Customer,Date,DesiredDayDiff) values
('aaa','20180912',0),
('aaa','20180918',6),
('aaa','20180925',13),
('aaa','20180927',15),
('aaa','20180928',16),
('bbb','20180907',0),
('bbb','20180911',4),
('bbb','20180911',4)

select
    *,
    COALESCE(DATEDIFF(day,LAG(Date) OVER (PARTITION BY Customer ORDER By Date),Date),0)
from
    @t

Результаты:

Customer Date       DesiredDayDiff 
-------- ---------- -------------- -----------
aaa      2018-09-12 0              0
aaa      2018-09-18 6              6
aaa      2018-09-25 13             7
aaa      2018-09-27 55             2
aaa      2018-09-28 66             1
bbb      2018-09-07 0              0
bbb      2018-09-11 4              4
bbb      2018-09-11 4              0

Для соответствияваш "желаемый" столбец, я должен использовать FIRST_VALUE вместо.

...