2017-12-27 174 views
2

我有一个包含以下数据的表。如何编写sql查询以获得下面的结果

actual table data

和预期的结果将是下面的数据。

Expected table data

这里第一步完成日期是第二步的抵达日期和第二步完成日期是第3步的抵达日期。

如何编写SQL查询以获得此结果。

+0

你正在使用哪个版本的sql server? –

回答

-1

some_logical_grouping_of_data shoud定义可用于的数据组。

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; 
0

这个脚本给您预期的结果

;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  
0

这应该成为你的目的,完成日期为开始日期从明年ID

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 
0

授第n行根据id列的升序排列。(如果id列有空白)。然后与rn = rn + 1一起使用LEFT JOIN/RIGHT JOIN

查询

;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]; 
-1

这是一个坏主意,加入基于字符串后缀的数据。我假设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; 
+0

为什么downvote? –