sql server查询,每个单元格的值是下一个单元格 - 1

时间:2014-08-30 10:44:57

标签: sql sql-server tsql

我有一张如下表:

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()函数,但我得到了任何结果。任何人都可以帮助我如何做到这一点,甚至是我应该从哪个方法或功能来完成我的工作。 谢谢

编辑。 注意:我的表格有重复日期

2 个答案:

答案 0 :(得分: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 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

答案 1 :(得分: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