SQL Server-从一列中选择值对

SQL Server-从一列中选择值对,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,有没有一种方法可以从SQL中的一列中顺序选择成对的值 i、 e.如果我有一个有一列数字的表 SomeID ------ 1 2 3 5 7 11 我需要返回一组两列,如下所示: FirstID SecondID ------------------- 1 2 2 3 3 5 5 7 7 11 这能做到吗 编辑: 我应该提到的是,第一个结果集的顺序很重要,可能不是连续的 i、 可能是 SomeID

有没有一种方法可以从SQL中的一列中顺序选择成对的值

i、 e.如果我有一个有一列数字的表

SomeID
------
1
2
3
5
7
11
我需要返回一组两列,如下所示:

FirstID    SecondID
-------------------
1          2
2          3
3          5
5          7
7          11
这能做到吗

编辑:

我应该提到的是,第一个结果集的顺序很重要,可能不是连续的

i、 可能是

SomeID    
5
3
9
8
...

FirstID    SecondID
5          3
3          9
9          8
...        ...

简单方法是,使用相关子查询返回以下值:

select t1.id as FirstID, (select min(t2.id) from tablename t2
                          where t2.id > t1.id) as SecondID
from tablename
where t1.id < (select max(id) from tablename)

您可以使用窗口函数(超前或滞后)来完成此操作


如果您不关心获取最后一行,那么您可以单独使用CTE查询,而不必使用CTE。

与表本身进行简单的左连接,如-

Select a.somecol,b.somecol
From TableA as a
Left join TableA as b
On b.someid = a.someid + 1
Where b.someid is not null
适用于sql server>=2005

请尝试以下操作

declare @t table( SomeID int) insert into @t (SomeID) values
(5),(3),(9),(8)


;with t as(Select someid,row_number() over (order by (select 1)) as  rn 
from @t)        
        Select a.someid,b.someid
        From t as a
        Left join t as b
        On b.rn = a.rn + 1
        Where b.someid is not null

你以3秒的优势获胜:@Arvo,也许我比你早4秒开始?@jarlh我应该提到,第一次查询的顺序很重要,可能不是sequential@McFixit,也许您可以编辑您的问题调整表数据和结果?我们可以使用任何ID/顺序列来获取下一行?@jarlh当前,不…虽然我开始意识到这可能是一个XY问题,因为我的单列结果集来自另一个查询,也许我可以在那里工作…不总是+1。为什么左连接和b.someid都不为null?不幸的是,我使用的是SQL Server 2008 R2,LEAD似乎是在2012年引入的。我将行号加入到我原来的单列结果集中,这就是我所使用的,为什么左连接和b.someid组合在一起不为null?你不能简单地做一个内部连接吗?
SELECT 
    t1.SomeID as FirstID,
    t2.SomeID as SecondID
FROM
(
    SELECT SomeID, ROW_NUMBER()OVER(ORDER BY SomeID) as Inc
    FROM TABLE
) t1
LEFT JOIN
(
    SELECT SomeID, ROW_NUMBER()OVER(ORDER BY SomeID)-1 as Inc
    FROM TABLE
) t2 ON t2.Inc = t1.Inc
declare @t table( SomeID int) insert into @t (SomeID) values
(5),(3),(9),(8)


;with t as(Select someid,row_number() over (order by (select 1)) as  rn 
from @t)        
        Select a.someid,b.someid
        From t as a
        Left join t as b
        On b.rn = a.rn + 1
        Where b.someid is not null