我们说我有一张桌子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。
答案 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
答案 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