Sql 基于当前记录的下一个/上一个记录

Sql 基于当前记录的下一个/上一个记录,sql,sql-server-2008,Sql,Sql Server 2008,我有一个不按任何列排序的表。如果我只知道当前记录的Id,有没有办法选择下一个/上一个记录?(我正在使用mssql) 提前谢谢 试试这个: VALUES (1, 'label1', '2011-01-10'), (7, 'label2', '2011-01-15'), (5, 'label3', '2011-01-12'), (10, 'label10', '2011-01-25'), (12, 'label8', '2011-01-13'),

我有一个不按任何列排序的表。如果我只知道当前记录的Id,有没有办法选择下一个/上一个记录?(我正在使用mssql)

提前谢谢

试试这个:

VALUES (1, 'label1', '2011-01-10'), (7, 'label2', '2011-01-15'),
       (5, 'label3', '2011-01-12'), (10, 'label10', '2011-01-25'),             
       (12, 'label8', '2011-01-13'), (2, 'label5', '2011-01-29')

select * from table007; 

Declare @inptID int=12;

;WITH CTE 
as
(
   select *, ROW_NUMBER() over (order by (select 0)) as rn 
   from table007
 )

select * 
from CTE 
where rn in( select rn-1 from CTE where id = @inptID)
union all
select * from CTE where rn in(select rn + 1 from CTE where id = @inptID);
SQL小提琴演示


如果未按任何列排序,则没有确定的下一条或上一条记录。SQL Server中的数据没有顺序,除了由
order by
子句指定的顺序之外。

如果您确实想从所附列表中获取上一个顺序,下面是一种方法

declare @t table(Id int, Label varchar(10), Date date, s int identity(1,1))
insert @t (id, label, date) 
values(1,'label1','2011-01-10'),(7,'label2','2011-01-15'),
(5,'label3','2011-01-12'),(10,'label10','2011-01-25'),
(12,'label8','2011-01-13'),(2,'label5','2011-01-29')

--select the data with a self join

select t1.id as previous_id, t2.id, t2.Label, t2.Date, t3.id, t3.id as next_id
from @t t1
right join
@t t2 on t1.s + 1 = t2.s
left join
@t t3  on t2.s = t3.s - 1

哪个版本?如果是2012 sql server,则查看lead&lag用于获取这些结果的查询是什么?查询可能不同,但我想为所有查询创建一个存储过程再次查看我关于此主题的问题!你们的订货条款是什么?:-)此查询有问题。。。它返回的不是我想要的。。。给我3分钟的时间,我会附上截图无论你在问题A中解释了什么,它做得对吗?请看截图好吗?有什么想法吗?你能在截图中只显示discussionthreadid,rn列吗?是708和710。这就是你要问的吗?我不确定我有什么是s专栏。我桌上没有这本书。要我创建吗?Id、标签、日期是列。我不希望您创建新的列,我只希望您用您拥有的数据填充临时表,然后您可以将这些行链接到上一行swell,它适用于上一行,谢谢!那么我如何修改这个来同时看到下一个和上一个呢?@Vytalyi我现在注意到你想要下一个和上一个,所以我修改了我的脚本以包括bothYeah,看起来它可以工作。不是一个标准的解决方案,但我认为我可以这样做,直到找到更好的。谢谢!正如您所说,不会有任何顺序,但根据我的理解,当数据存储在内存中时,它只会附加到最后插入的行。所以OP也希望这样。我的意思是他希望从堆中获取上一行和下一行。
declare @t table(Id int, Label varchar(10), Date date, s int identity(1,1))
insert @t (id, label, date) 
values(1,'label1','2011-01-10'),(7,'label2','2011-01-15'),
(5,'label3','2011-01-12'),(10,'label10','2011-01-25'),
(12,'label8','2011-01-13'),(2,'label5','2011-01-29')

--select the data with a self join

select t1.id as previous_id, t2.id, t2.Label, t2.Date, t3.id, t3.id as next_id
from @t t1
right join
@t t2 on t1.s + 1 = t2.s
left join
@t t3  on t2.s = t3.s - 1