2014-08-30 54 views
0

我有一個表,如下圖所示:SQL Server查詢,每個單元格的值是下一個單元格 - 1

id DateFrom  
-------------------- 
1  2000/05/01  
2  2000/05/05 
3  2000/05/05 
4  2000/05/05  
5  2000/05/10  
6  2000/05/15  
7  2000/05/25  

,我想使它像這樣。哪個DateTo包含下一個日期 - 1天

id DateFrom  DateTo 
--------------------------- 
1  2000/05/01 2000/05/04 
2  2000/05/05 2000/05/09 
3  2000/05/05 2000/05/09 
4  2000/05/05 2000/05/09 
5  2000/05/10 2000/05/14 
6  2000/05/15 2000/05/24 
7  2000/05/25 null 

我使用RowNumber()函數,但我didng得到任何結果。任何人都可以幫助我如何去做,甚至是從哪種方法或功能來執行我的工作。 謝謝

編輯。 注:我的表中有重複的日期

+2

使用'LEAD':http://msdn.microsoft.com/en-us/library/hh213125.aspx – ruakh 2014-08-30 10:49:39

回答

2

一種方法是使用自加入這樣的:

SELECT 
    t1.id, 
    t1.DateFrom, 
    DATEADD(DAY,-1,t2.DateFrom) AS DateTo 
FROM table1 t1 
LEFT JOIN table1 t2 ON t2.id = t1.id+1 

Sample SQL Fiddle

編輯:正如你有重複的,你可以使用相關子查詢代替。我已經更新了SQL小提琴,包括第二個解決方案:

select 
    id, 
    DateFrom, 
    (
     select top 1 dateadd(day,-1,datefrom) 
     from table1 
     where id > t1.id and datefrom > t1.datefrom 
     order by id 
    ) as DateTo 
from table1 t1 
+0

謝謝你,它的不錯,但我的表有,因爲我忘了重複值要注意 。我編輯了我的問題。 – 2014-08-30 13:35:43

+0

@Arashbahreini看到我更新的答案,我認爲它應該產生所需的輸出。 – jpw 2014-08-30 13:48:13

1

下面是一個使用LEAD替代:

SELECT 
    DateFrom, 
    DATEADD(dd, -1, LEAD(DateFrom) OVER (ORDER BY DateFrom)) AS DateTo 
FROM SomeTable; 

SqlFiddle here

編輯
如果你想消除重複,首先通過DISTINCT過濾器(例如CTE或派生表)傳遞日期數據。

WITH cteUniqueDates AS 
(
    SELECT DISTINCT DateFrom 
    FROM SomeTable 
) 
SELECT 
    DateFrom, 
    DATEADD(dd, -1, LEAD(DateFrom) OVER (ORDER BY DateFrom)) AS DateTo 
FROM cteUniqueDates; 

Updated Fiddle

+0

非常緊湊,很好,但只能從SQL 2012開始? – jpw 2014-08-30 11:01:48

+0

是的,雖然當然注意到Sql 2014已經出來,所以不是最前沿的:) – StuartLC 2014-08-30 11:04:24

+0

謝謝,它很好,但我的表格有重複值,因爲我忘了注意。我編輯了我的問題。 – 2014-08-30 13:36:18

相關問題