计算SQL Server中连续行之间的差异

时间:2020-02-07 19:33:03

标签: sql-server tsql rows

我有一张表格,其中包含项目的各个部分及其开始和结束日期。这是SQL Server 2017中的任务。任务是按项目列出开始,结束日期和持续时间。 (一个项目包含所有行,其中下一行的开始日期与上一行的结束日期相同。没有行重叠)

有了这个,您可以重现我正在使用的相同样本数据。

CREATE TABLE PROJECTS (
Task_id int PRIMARY KEY ,
Start_Date date,
End_Date date )

INSERT INTO PROJECTS
VALUES 
(1, '01/01/2020','01/02/2020'),
(2, '01/02/2020','01/03/2020'),
(3, '01/03/2020','01/04/2020'),

(4, '01/06/2020','01/07/2020'),
(5, '01/07/2020','01/08/2020'),

(6, '01/10/2020','01/11/2020'),

(7, '01/12/2020','01/13/2020'),

(8, '01/21/2020','01/22/2020'),
(9, '01/22/2020','01/23/2020'),
(10,'01/23/2020','01/24/2020')

根据上述数据,我的输出如下:

Project_id  Start_Date  End_Date    Duration_days
1           01/01/2020  04/01/2020  3
2           06/01/2020  08/01/2020  2
3           10/01/2020  11/01/2020  1
4           12/01/2020  13/01/2020  1
5           21/01/2020  24/01/2020  3

下面的代码代表执行的第一部分,即结束日期之间的差的计算。

select projects.*,
   datediff(day, end_date,
            lead(end_date) over (partition by task_id order by end_date)
           ) as diff
from projects;

这是我所期望的:

Task_id Start_Date  End_Date    diff
1       2020-01-01  2020-01-02  1
2       2020-01-02  2020-01-03  1
3       2020-01-03  2020-01-04  1
4       2020-01-06  2020-01-07  3
5       2020-01-07  2020-01-08  1
6       2020-01-10  2020-01-11  3
7       2020-01-12  2020-01-13  2
8       2020-01-21  2020-01-22  9
9       2020-01-22  2020-01-23  1
10      2020-01-23  2020-01-24  1

在Diff列的每一行中,我得到的都是NULL。

1 个答案:

答案 0 :(得分:0)

选择a。*,如果a.Task_id = 1则为1,否则为else datediff(day,b.End_Date,a.end_date )以diff结尾 来自#projects 在b.Task_id = a.Task_id-1上左加入#projects b