簡體   English   中英

sql server query,每個單元格的值是下一個單元格-1

[英]sql server query , each cell's value is next cell - 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    

我想這樣做。 哪個日期包含下一個日期-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()函數,但是沒有得到任何結果。 有人可以幫我怎么做,或者我應該通過哪種方法或功能來執行我的工作? 謝謝

編輯。 注意:我的表有重復的日期

一種方法是使用像這樣的自聯接:

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

示例SQL提琴

編輯:由於有重復項,因此可以改用相關子查詢。 我已經更新了SQL Fiddle,以包括第二個解決方案:

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

這是使用LEAD的替代方法:

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

SqlFiddle在這里

編輯
如果要消除重復項,請首先通過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;

更新小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM