簡體   English   中英

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.

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