2016-04-18 106 views
0

有沒有一種方法可以從SQL中的一列中按順序選擇值對?SQL Server - 從一列中選擇值對

即如果我有一個表的數字

SomeID 
------ 
1 
2 
3 
5 
7 
11 

我需要像這樣返回兩列一組的一列:

FirstID SecondID 
------------------- 
1   2 
2   3 
3   5 
5   7 
7   11 

可以這樣做?

編輯:

我已經提到,第一個結果集事項的順序,可能不連續的。

即可能是

SomeID  
5 
3 
9 
8 
... 

FirstID SecondID 
5   3 
3   9 
9   8 
...  ... 
+1

任何ID /順序列,我們可以用來獲得「下一行」? – jarlh

+0

@jarlh目前,不......我開始意識到這可能是一個XY問題,因爲我的單列結果集來自另一個查詢,也許我可以把它工作到那裏... – McFixit

回答

2
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 

作品SQL Server上> = 2005

+0

我將ROW_NUMBER工作到了原始(單列)結果集,這實際上就是我所用的 – McFixit

1

簡單的方法,使用相關子查詢返回以下值:

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) 
+0

你贏了3秒:) – Arvo

+0

@阿爾沃,也許我開始4秒之前? – jarlh

+0

@jarlh我應該提到,第一個查詢的順序很重要,可能不是連續的 – McFixit

2

您可以用窗口函數做到這一點,LEAD(或LAG

;WITH My_CTE AS 
(
SELECT 
    some_id as first_id, 
    LEAD(some_id, 1, NULL) OVER (ORDER BY some_id) AS second_id 
FROM 
    My_Table 
) 
SELECT 
    first_id, 
    second_id 
FROM 
    My_CTE 
WHERE 
    second_id IS NOT NULL -- to not get 11, NULL at the end 
ORDER BY 
    first_id 

如果你不關心如何得到最後一行t如果你不使用CTE,你可以直接使用CTE查詢。

+1

不幸的是,我正在使用SQL Server 2008 R2和LEAD似乎已於2012年推出 – McFixit

1

簡單隻剩下表本身加入喜歡 -

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 
+0

並不總是+1。 (爲什麼左連接和b.someid不爲空?) – jarlh

1

試試這個

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 
+0

爲什麼'left join'與'where b.someid是不是空'?你不能簡單地做一個內部連接嗎? – jarlh