我有一张表格,其中包含项目的各个部分及其开始和结束日期。这是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。
答案 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