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)
但是这很慢,因为我们正在对每一行进行聚合.有没有比这更有效的替代解决方案?
由于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)