当数据按日期排序然后按 Id 排序时获取下一条记录

Getting a next record when data is ordered by Date and then Id

我需要提供从单个 table 获取下一条/上一条记录的 ID。 Table 重要的字段是 Id 和 Date。数据示例:

Date         Id
2015/01/15   3 
2015/01/15   5
2015/01/15   7 
2015/01/16   4 
2015/01/16   6 
2015/01/16   8 

如您所见,记录按日期排序,然后是 ID。如果我当前的记录是 Id=5 的记录,则查询应该 return 7 用于下一条记录,3 用于前一条。这意味着查询将收到一个 Id 参数,并且 return 适当的结果

有人有什么想法吗?我更喜欢一种通用的 sql 方法,而不是特定于特定数据库系统的方法。

DECLARE @table table
(
  Date Date,
  Id int
)

INSERT @table VALUES 
('2015/01/15', 3), 
('2015/01/15', 5),
('2015/01/15', 7),
('2015/01/16', 4),
('2015/01/16', 6),
('2015/01/16', 8)


SELECT 
  *,
  (SELECT TOP 1 Id FROM @table WHERE [Date] < [current].[Date] OR ([Date] = [current].[Date] AND Id < [current].Id) ORDER BY [Date] DESC, Id DESC) AS PreviousId,
  (SELECT TOP 1 Id FROM @table WHERE [Date] > [current].[Date] OR ([Date] = [current].[Date] AND Id > [current].Id) ORDER BY [Date], Id) AS NextId 
FROM 
  @table [current]

使用子查询应该可以,但同一日期的 ID 应该是唯一的

如果您使用的是 SQL Server 2012,您可以利用 LAGLEAD 函数,如下所示:

DECLARE @table table
(
  Date Date,
  Id int
)

INSERT @table VALUES 
('2015/01/15', 3), 
('2015/01/15', 5),
('2015/01/15', 7),
('2015/01/16', 4),
('2015/01/16', 6),
('2015/01/16', 8)

;with cte as
(
select 
[Date],
Id,
LAG(Id, 1, 0) over(order by [date]) previousId,
LEAD(Id, 1, 0) over(order by [date]) nextId
from @table
)
select * from cte where id = 5