如何编写sql查询以获得以下结果

问题描述 投票:2回答:5

我有一张包含以下数据的表格。

预期结果将低于数据。

这里,step1完成日期是step2的到达日期,step2完成日期是step3的到达日期。

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

sql sql-server
5个回答
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的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

0
投票

根据id列的升序给出一个行号。(如果id列有任何间隙)。然后使用LEFT JOIN / RIGHT JOINrn = 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];

-1
投票

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;

-1
投票

基于字符串后缀连接数据是个坏主意。我假设step1总是有ID 1step13总是有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;
© www.soinside.com 2019 - 2024. All rights reserved.