【问题标题】:Next/previous record based on current基于当前的下一个/上一个记录
【发布时间】:2012-09-27 12:06:44
【问题描述】:

我有一个未按任何列排序的表。如果我只知道当前的 ID,有什么方法可以选择下一个/上一个记录? (我用的是mssql)

Id     Label     Date
---------------------
1      label1    2011-01-10
7      label2    2011-01-15 -- how to get previous?
5      label3    2011-01-12 -- I know id of this record
10     label10   2011-01-25 -- how to get next?
12     label8    2011-01-13
2      label5    2011-01-29

提前致谢!

【问题讨论】:

  • 哪个版本?如果是 2012 年的 sql server,请查看 lead && lag blog.sqlauthority.com/2011/11/15/…
  • 获取这些结果的查询是什么?
  • 查询可能不同,但我想为所有查询创建一个存储过程
  • 看看我关于这个话题的问题stackoverflow.com/questions/12402524/…
  • row_number() 必须使用order by - 再次!你的 order by 条款是什么? :-)

标签: sql sql-server-2008


【解决方案1】:

试试这个:

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 小提琴演示

DEMO

【讨论】:

  • 这个查询有问题...它返回的不是我想要的...给我 3 分钟,我会附上屏幕截图
  • 无论您在问题中解释了什么,它都做得正确
  • 你能看一下截图吗?有什么想法吗?
  • 你能在屏幕截图中只显示讨论线程id,rn 列吗?
  • 是 708 和 710。是你问的吗?
【解决方案2】:

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

【讨论】:

  • 正如你所说,不会有任何顺序,但根据我的理解,当数据存储在内存中时,它只是附加到最后插入的行。所以这也是 OP 想要的。我的意思是他想要从堆中获取上一行和下一行。
【解决方案3】:

如果你真的想要你所附列表中的前一个,这里有一种方法。

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

【讨论】:

  • 我不确定我得到了什么是 s 列。我在表中没有此列。你要我创作吗?
  • Id、Label、Date 是列。我不希望你创建新列,我只想让你用你拥有的数据填充临时表,然后你可以将这些行链接到以前的行
  • 嗯,它适用于以前的,谢谢!以及如何修改它以同时查看下一个和上一个?
  • @Vytalyi 我现在注意到你想要下一个和上一个,所以我修改了我的脚本以包含两者
  • 是的,看起来可行。不是标准解决方案,但我认为我可以做到这一点,直到找到更好的解决方案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2013-07-29
相关资源
最近更新 更多