sql - 如何在 SQL Server 中有效获取上一行和下一行的值

标签 sql sql-server sql-server-2008 tsql

假设我有这些行,

仪器ID

547
698
708

InstrumentID 不是自动生成的列。

假设我在过程中传递参数为 698,我应该得到前一个值为 547 的值,下一个值为 708 的值。如何在 SQL 中有效地执行此操作?

我有这个程序,但效率不高(而且不正确)。

Alter PROCEDURE GetNextAndPreviousInsturmentID
(
    @InstrumentID   varchar(14),
    @PreviousInstrumentID   varchar(14) OUT,
    @NextInstrumentID   varchar(14) OUT
)
AS
BEGIN
    Declare @RowNum int = 0

    Select @RowNum = ROW_NUMBER() Over (Order by Cast(@InstrumentID as decimal(18))) From Documents Where InstrumentID = @InstrumentID 

    ;With normal As
    (   
        Select ROW_NUMBER() Over (Order by Cast(@InstrumentID as decimal(18))) as RowNum, Cast(InstrumentID as decimal(18)) as InstrumentID
            From Documents 
    )
    Select @PreviousInstrumentID = InstrumentID From normal
        Where RowNum = @RowNum - 1
    Select @NextInstrumentID = InstrumentID From normal
        Where RowNum = @RowNum + 1

END
GO

最佳答案

这是一个更简单的解决方案,但仍然更有效

SELECT P.PreviousID, N.NextID
FROM
(SELECT  MAX(D.InstrumentID) PreviousID
FROM Documents D
WHERE InstrumentID < @InstrumentID) P
CROSS JOIN
(SELECT  MIN(D.InstrumentID) NextID
FROM Documents D
WHERE InstrumentID > @InstrumentID) N

关于sql - 如何在 SQL Server 中有效获取上一行和下一行的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14951682/

相关文章:

SQL Server : stored procedure IFNULL check

sql-server-2008 - 如何在sql中以半小时和小时的间隔显示时间

mysql - REPLACE INTO 在 MySQL 上不起作用(表结构问题?)

sql - 在编写 sql server 查询时如何编写类似于 Linq .Any() 的内容

sql-server - 是否有更快的方法从另一列更新新列,但从前一行更新?

sql-server - 寻找人口最多的城市

sql-server - 如何提高这个sql查询性能?

sql - 如果记录插入到表中,则触发插入到另一个表

sql - 如何在代码优先迁移期间设置新表列的默认值?

c# - 简单的 20 行选择查询(大多数列是 nvarchar(max))花费太长时间 - 15 秒或更长时间