假设我有这些行,
仪器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/