2017-12-27 119 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? –