我有一张包含以下数据的表格。
预期结果将低于数据。
这里,step1完成日期是step2的到达日期,step2完成日期是step3的到达日期。
如何编写SQL查询以获得此结果。
此脚本提供您的预期结果
;With Cte(
id,StepName,ArrivalDate,duedate
)
AS
(
SELECT 1,'Step1','25/12/2017','1/1/2018' UNION ALL
SELECT 2,'Step2','26/12/2017','1/1/2018' UNION ALL
SELECT 3,'Step3','27/12/2017','1/1/2018'
)
SELECT
id
,StepName
,ArrivalDate
,duedate
,ISNULL(LEAD(ArrivalDate,1)OVER(ORDER BY ArrivalDate),'') AS CompletionDate
FROM CTE
结果
id StepName ArrivalDate duedate CompletionDate
-----------------------------------------------------
1 Step1 25/12/2017 1/1/2018 26/12/2017
2 Step2 26/12/2017 1/1/2018 27/12/2017
3 Step3 27/12/2017 1/1/2018
这应该符合您的目的,完成日期为下一个id的startdate
SELECT x.id
,x.stepname
,x.arrival_date
,x.due_date
,isnull(y.arrival_date, '') Completion_date
FROM x
LEFT JOIN (
SELECT id
,step1
,step2
,arrival_date
FROM x
) y ON x.id = y.id + 1
根据id
列的升序给出一个行号。(如果id
列有任何间隙)。然后使用LEFT JOIN
/ RIGHT JOIN
和rn = rn + 1
。
询问
;with cte as(
select [rn] = row_number() over(
order by [id]
), *
from [your_table_name]
)
select t1.[stepName], t1.[ArrivalDate], t1.[dueDate],
coalesce(t2.[dueDate], '') as [completiondate]
from cte t1
left join cte t2
on t1.[rn] + 1 = t2.[rn];
some_logical_grouping_of_data定义可用于的数据组。
Select ID, stepname, arrival_date, duedate,
LEAD ( arrival_date) OVER ( partition by "some_logical_grouping_of_data" order by ID) as completion_date
from table;
基于字符串后缀连接数据是个坏主意。我假设step1
总是有ID 1
,step13
总是有ID 13
等等。然后你可以做类似的事情
SELECT t1.ID, t1.Stepname, t1.arrival_date, t2.arrival_date as completion_date
FROM tablename t1
LEFT JOIN tablename t2 on t1.ID + 1 = t2.ID;