TSQL在列表中获取Prev和Next ID

时间:2014-04-10 23:20:23

标签: tsql sql-server-2012

我们说我有一张桌子Sales

  • SaleID int
  • UserID int
  • Field1 varchar(10)
  • Created Datetime

现在我已加载并使用SaleID = 23

查看记录

使用存储过程找出属于我的当前SalesID的PREVIOUS和NEXT SaleID = 23值的正确方法是什么({ {1}})?

我可以做一个

UserID = 1

SELECT TOP 1 * FROM Sales WHERE SaleID > 23 AND UserID = 1 相同,但是那2个SQL调用。

有更好的方法吗?

我正在使用SQL Server 2012。

3 个答案:

答案 0 :(得分:2)

您可以使用SQL Server 2012中引入的LAG() and LEAD() functions来获取上一个/下一个SaleID(或任何其他字段)。

例如:

SELECT *, 
  LAG(SaleID) OVER (PARTITION BY UserID ORDER BY SaleID) Prev,
  LEAD(SaleID) OVER (PARTITION BY UserID ORDER BY SaleID) Next
FROM Sales S

SqlFiddle

答案 1 :(得分:1)

如果在thepirat000的答案中省略了LAG()LEAD()函数中的PARTIITION BY子句,则可以根据SaleID列找到相关的上一个或下一个记录。 / p>

这是SQL查询

SELECT *, 
  LAG(SaleID) OVER (ORDER BY SaleID) Prev,
  LEAD(SaleID) OVER (ORDER BY SaleID) Next
FROM Sales S

PARTITION BY子句使您可以在基于UserID的分组中使用这些功能,如thepirat000的代码

答案 2 :(得分:1)

如果您希望下一行和以前的记录仅针对单行,或者至少针对一小部分项目,则查询也可以在性能方面提供帮助(作为渴望学习的答案&#39;评论)< / p>

select
    (select top 1 t.SaleID from Sales t where t.SaleID < tab1.SaleID) as prev_id,
    SaleID as current_id,
    (select top 1 t.SaleID from Sales t where t.SaleID > tab1.SaleID) as next_id
from Sales where SaleID = 2