2015-07-02 38 views
2

我想寫一個sql查詢來獲取下一行的列作爲一行的列。測試例如下: 表:sql查詢得到下一行的列爲一行的列

ID startno 
1  1    
2  5   
3  9   

我想要得到的SQL查詢來獲取結果如下:

ID startno endno 
1  1   5 
2  5   9 
3  9   null 
+0

您使用的SQL Server版本? – ughai

回答

3

你可以這樣來做:

WITH CTE AS 
(SELECT *,ROW_NUMBER()OVER(ORDER BY ID) AS RN 
FROM TableName) 

SELECT T1.ID,T1.startno,T2.startno as endno 
FROM CTE T1 LEFT JOIN 
    CTE T2 ON T1.RN=(T2.RN-1) 

您也可以使用ON T1.ID=(T2.ID-1)。但是,如果ID字段不是連續的或者缺少任何ID,Join會無法正常工作。這就是爲什麼我使用ROW_NUMBER獲得連續的數字加入表格。

結果:

ID startno endno 
1 1  5 
2 5  9 
3 9  (null) 

樣品結果SQL Fiddle

+0

你可以讓sql稍微簡單些嗎?因爲'下面的結果表已經包含'with cte'本身。謝謝。 – stkflmb12

+1

@ stkflmb12:然後使用任何不同的名稱,如'CTE1'或'endtable'或任何其他名稱。這是最簡單的方法。如果你真的想改變它,你將不得不使用多個子查詢,這些子查詢的規模很大,缺乏可讀性和簡單性。我不會推薦它。 –

+0

是的。我明白了,用這種方式做到了。謝謝。 – stkflmb12

1

這是another way of doing它:

SELECT id, StartNo, 
     (SELECT TOP(1) StartNo 
     FROM Table1 t2 WHERE t2.id > t1.id ORDER BY t2.id) EndNo 
FROM Table1 t1 
+0

ID不連續。它需要爲每一行創建一個連續的rowno。 – stkflmb12

+0

'ID' [不需要連續](http://sqlfiddle.com/#!3/67042/1)。 – Kaf

+0

如果ID是一個varchar不是數字類型,它不能比較它們,所以我們不能使用ID來解決這個問題。 – stkflmb12