如何根据特定条件查找表中的下一个值

Tam*_*ath 6 sql sql-server sql-server-2008

我有一张桌子:

ID | Name | Date
 1 | ABC  | 2015-01-01
 2 | XYZ  | 2015-01-02
 3 | ABC  | 2015-01-03
 4 | ABC  | 2015-01-04
Run Code Online (Sandbox Code Playgroud)

我想查询此表,结果如下:

ID | Name | Date       | NextDate
 1 | ABC  | 2015-01-01 | 2015-01-03
 2 | XYZ  | 2015-01-02 | null
 3 | ABC  | 2015-01-03 | 2015-01-04
 4 | ABC  | 2015-01-04 | null
Run Code Online (Sandbox Code Playgroud)

一个解决方案是:

select t1.*,
  (select min(t2.Date) from TAB t2 where t2.ID > t1.ID t2.Name = t1.Name) NextDate
from TAB t1
Run Code Online (Sandbox Code Playgroud)

但是这很慢,因为我们正在对每一行进行聚合.有没有比这更有效的替代解决方案?

Pரத*_*ீப் 3

由于SQL SERVER 2008不支持LEAD窗口函数,我们必须使用row_number和 来模拟它self join。尝试这个

;WITH cte
     AS (SELECT t1.*,
                Row_number()
                  OVER(
                    partition BY Name
                    ORDER BY [Date]) AS rn
         FROM   TAB t1)
SELECT a.ID,a.Name,a.Date,b.Date as nextdate
FROM   cte a
       LEFT OUTER JOIN cte b
                    ON a.Name = b.Name
                       AND a.rn + 1 = b.rn ORDER BY a.ID
Run Code Online (Sandbox Code Playgroud)