[英]Selecting the date of the previous record when dates are non-consecutive in SQL?
[英]SQL query to merge consecutive dates and ignore non-consecutive ones
我需要一些幫助,因為我對SQL語句不太滿意...
我在數據庫中有下表:
+------+------------+------------+
| E_ID | FromDate | ToDate |
+------+------------+------------+
| 555 | 2012-01-01 | 2012-12-31 |
| 555 | 2013-01-01 | 2013-12-31 |
| 555 | 2014-01-01 | 2014-04-30 |
| 555 | 2014-05-01 | 2014-08-15 |
| 555 | 2014-08-16 | 2014-12-31 |
| 555 | 2015-01-01 | 2015-06-25 |
| 555 | 2015-07-01 | 2015-12-31 |
+------+------------+------------+
在玩了一點之后,我想合並按年份分組的連續日期,我來到了這個查詢:
select E_ID
,FromDate = MIN(FromDate)
,ToDate = MAX(ToDate)
from TbTest
group by E_ID
,DATEPART(YEAR,FromDate)
,DATEPART(YEAR,ToDate)
結果幾乎就是我想要的:
+------+------------+------------+
| E_ID | FromDate | ToDate |
+------+------------+------------+
| 555 | 2012-01-01 | 2012-12-31 |
| 555 | 2013-01-01 | 2013-12-31 |
| 555 | 2014-01-01 | 2014-12-31 |
| 555 | 2015-01-01 | 2015-12-31 |
+------+------------+------------+
這幾乎是完美的。 這里的問題是,在2015年的日期中存在重疊:
| 555 | 2015-01-01 | 2015-06-25 |
| 555 | 2015-07-01 | 2015-12-31 |
因此,它不是2015年6月26日的FromDate,而是2015年7月1日,因此我們有6天的“間隔”。 對於這些特定情況,我想將它們拆分,所以我想要的結果是:
+------+------------+-------------+
| E_ID | FromDate | ToDate |
+------+------------+-------------+
| 555 | 2012-01-01 | 2012-12-31 |
| 555 | 2013-01-01 | 2013-12-31 |
| 555 | 2014-01-01 | 2014-12-31 |
| 555 | 2015-01-01 | 2015-06-25 |
| 555 | 2015-07-01 | 2015-12-31 |
+------+------------+-------------+
簡而言之,我需要真正連續的日期進行合並,而不會丟失一天。
PS:我現在在想,ToDate有時可能像9999-12-31,所以我的按年分組實際上是不正確的...
謝謝您的幫助!
很抱歉,因為我還沒有時間測試下面的代碼,但我想這個主意就在這里。
with aggr as
(
select E_ID,
FromDate,
ToDate,
lev = 0
from TbTest
UNION ALL
select T.E_ID,
A.FromDate,
T.ToDate,
lev = A.lev + 1
from TbTest T
inner join aggr A
on T.e_ID = A.E_ID AND datediff(day,A.Todate,T.FromDate) = 1
AND DATEPART(YEAR,A.TODate) = DATEPART(YEAR,T.FromDate)
)
select E_ID, FromDate, ToDate from aggr
EXCEPT
Select AG1.E_ID, AG1.FromDate, AG1.ToDate
from aggr AG1
inner join aggr AG2
ON AG1.E_ID = AG2.E_ID
AND AG1.Fromdate >= AG2.fromdate and AG1.todate <= AG2.todate and AG1.lev < AG2.lev
Order by E_ID, Fromdate
編輯1:我已修復腳本。 這是SQL Fiddle 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.