如何检索集合中的下一行值?

时间:2017-07-21 08:26:25

标签: tsql

我想迭代一个表并通过开始日期从下一行排序获取记录,但我想通过按id处理行ID来实现这一点,例如:

主表

ID       |         StartingDate            |      PlannedFinishDate  

 1            2017-01-13 17:48:05.150           2017-01-15 12:00:00.00
 1            2017-01-14 14:15:09.000           2017-01-16 12:00:00.00
 1            2017-01-16 09:40:30.000           2017-01-18 12:00:00.00
 2            2017-02-06 12:00:00.000           2017-02-10 12:00:00.00
 2            2017-03-01 13:45:00.000           2017-03-05 12:00:00.00
 3            2017-02-09 11:31:16.830           2017-02-11 12:00:00.00

从下一行获取后的表格:

ID       |         StartingDate            |      PlannedFinishDate  

 1            2017-01-13 17:48:05.150           2017-01-16 12:00:00.00
 1            2017-01-14 14:15:09.000           2017-01-18 12:00:00.00
 1            2017-01-16 09:40:30.000           NULL
 2            2017-02-06 12:00:00.000           2017-03-05 12:00:00.00
 2            2017-03-01 13:45:00.000           NULL
 3            2017-02-09 11:31:16.830           NULL

1 个答案:

答案 0 :(得分:0)

似乎你实际上并没有问过迭代。您似乎想要检索每个开始日期的下一个计划完成日期。

您可以使用LEAD功能轻松完成此操作。此函数返回结果集中的下一个值。它需要一个ORDER BY子句才能知道下一行是什么。它还允许您指定PARTITION BY子句来对结果集进行分区。

由于您希望找到每个ID的下一个计划完成日期,因此您需要PARTITION BY ID

select 
    ID, 
    StartingDate,
    LEAD(PlannedFinishDate) OVER (PARTITION BY ID ORDER BY StartingDate ASC)
        AS NextFinishDate
FROM SomeTable

如果没有下一个值,则返回NULL。

此代码段

declare @table table (ID int, StartingDate datetime, PlannedFinishDate datetime)
insert into @table (ID,StartingDate,PlannedFinishDate)
values
( 1,'2017-01-13 17:48:05.150','2017-01-15 12:00:00.008'),
( 1,'2017-01-14 14:15:09.000','2017-01-16 12:00:00.008'),
( 1,'2017-01-16 09:40:30.000','2017-01-18 12:00:00.008'),
( 2,'2017-02-06 12:00:00.000','2017-02-10 12:00:00.008'),
( 2,'2017-03-01 13:45:00.000','2017-03-05 12:00:00.008'),
( 3,'2017-02-09 11:31:16.830','2017-02-11 12:00:00.008')

select 
    ID, 
    StartingDate,
    LEAD(PlannedFinishDate) OVER (PARTITION BY ID ORDER BY StartingDate ASC)
        AS NextFinishDate
FROM @table

返回:

ID  StartingDate            NextFinishDate
1   2017-01-13 17:48:05.150 2017-01-16 12:00:00.007
1   2017-01-14 14:15:09.000 2017-01-18 12:00:00.007
1   2017-01-16 09:40:30.000 NULL
2   2017-02-06 12:00:00.000 2017-03-05 12:00:00.007
2   2017-03-01 13:45:00.000 NULL
3   2017-02-09 11:31:16.830 NULL