查找与先前记录的日期差异并按类别划分
Finding the the difference in day from previous record and partitioning by category
我有以下 table:
+----------+------------+----------------+
| 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 服务器 2012+ 中有一些附加功能允许某种 window 运行?如果这可以使用 window 函数来完成,这将是一个奖励,因为它有望让我的查询更加整洁。
我找不到解决方案按另一个类别划分的类似讨论帖(在上面的这个例子中,它是客户)
如果我按照你的叙述并与上一行进行区分,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
为了匹配您的 "desired" 列,我必须改用 FIRST_VALUE
。
我有以下 table:
+----------+------------+----------------+
| 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 服务器 2012+ 中有一些附加功能允许某种 window 运行?如果这可以使用 window 函数来完成,这将是一个奖励,因为它有望让我的查询更加整洁。
我找不到解决方案按另一个类别划分的类似讨论帖(在上面的这个例子中,它是客户)
如果我按照你的叙述并与上一行进行区分,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
为了匹配您的 "desired" 列,我必须改用 FIRST_VALUE
。