TSQL获取列表上的上一个ID和下一个ID

TSQL获取列表上的上一个ID和下一个ID,tsql,sql-server-2012,Tsql,Sql Server 2012,假设我有一张桌子 萨利德国际酒店 用户ID int 字段1 varchar10 创建日期时间 现在我已经加载并查看了SaleID=23的记录 使用存储过程找出当前SaleID=23中属于我UserID=1的上一个和下一个SaleID值的正确方法是什么 我可以做一个 SELECT TOP 1 * FROM Sales WHERE SaleID > 23 AND UserID = 1 SaleID

假设我有一张桌子

萨利德国际酒店 用户ID int 字段1 varchar10 创建日期时间 现在我已经加载并查看了SaleID=23的记录

使用存储过程找出当前SaleID=23中属于我UserID=1的上一个和下一个SaleID值的正确方法是什么

我可以做一个

SELECT TOP 1 * 
FROM Sales 
WHERE SaleID > 23 AND UserID = 1   
SaleID<23也一样,但这是两个SQL调用

有更好的办法吗


我正在使用SQL Server 2012。

您可以使用SQL Server 2012中引入的获取上一个/下一个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

您可以使用SQL Server 2012中引入的获取上一个/下一个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

如果您在PIRAT000的答案中的or函数中省略了PARTITION BY子句,您可以根据SaleID列查找相关的以前或以后的记录

下面是SQL查询

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

PARTITION BY子句允许您在基于用户ID的分组中使用这些函数,如PIRAT000代码中所示

如果您在PIRAT000答案的or函数中省略PARTITION BY子句,您可以根据SaleID列查找相关的上一个或下一个记录

下面是SQL查询

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

PARTITION BY子句允许您在基于用户ID的分组中使用这些函数,如Pirat000的代码中所示

如果您希望下一个和上一个记录仅用于一行,或者至少用于一小部分项目,以下查询还可以在性能方面帮助您回答渴望学习的评论

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

如果您希望下一个和上一个记录仅用于一行,或者至少用于一小部分项目,那么以下查询也可以在性能方面帮助您回答“渴望学习”的评论

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

非常有趣,以前从未听说过滞后/超前。现在,我如何获取之前基于SaleID 23的记录…而不必将所有返回的记录放入tmp表中,然后提取我要查找的记录?SQL Server 2012为Transact-SQL开发人员引入了新的SQL函数,称为分析函数。其中一些分析函数是第一个值、最后一个值、超前、滞后等函数。你可以在我阅读你的示例时查看我的SQL示例,非常有趣。我仍然有点困惑如何确保我没有先加载整个表来计算滞后/超前…特别是如果这个表有数百万条记录。目前的目标是只获得2个值,基于SaleID=23的上一个值和下一个值。关于如何组合这些分析函数以优化实际存储过程的任何提示??非常有趣,以前从未听说过滞后/超前。现在,我如何获取之前基于SaleID 23的记录…而不必将所有返回的记录放入tmp表中,然后提取我要查找的记录?SQL Server 2012为Transact-SQL开发人员引入了新的SQL函数,称为分析函数。其中一些分析函数是第一个值、最后一个值、超前、滞后等函数。你可以在我阅读你的示例时查看我的SQL示例,非常有趣。我仍然有点困惑如何确保我没有先加载整个表来计算滞后/超前…特别是如果这个表有数百万条记录。目前的目标是只获得2个值,基于SaleID=23的上一个值和下一个值。关于如何组合这些分析函数以优化实际存储过程的任何提示??是否有一种方法可以只获取记录SaleID=23的上一个和下一个值,而不必在可能有数百万条销售记录的表中计算上述值?是否有一种方法可以只获取记录SaleID=23的上一个和下一个值而不必在一个可能有数百万条销售记录的表格中计算上述各项?