查找与上一个记录和按类别划分的日期差异

时间:2018-10-24 08:54:29

标签: sql sql-server function tsql partitioning

我有下表:

+----------+------------+----------------+
| 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 :(得分:1)

如果我遵循上一行的叙述和差异,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