当数据按日期排序然后按 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,您可以利用 LAG
和 LEAD
函数,如下所示:
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
我需要提供从单个 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,您可以利用 LAG
和 LEAD
函数,如下所示:
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