我有一张如下表:
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()函数,但我得到了任何结果。任何人都可以帮助我如何做到这一点,甚至是我应该从哪个方法或功能来完成我的工作。 谢谢
编辑。 注意:我的表格有重复日期
答案 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
编辑:由于您有重复项,您可以使用相关的子查询。我已经更新了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;
修改强>
如果要消除重复项,请首先通过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;