在开始和结束日期列之后

时间:2019-04-09 13:11:25

标签: sql sql-server

我有开始日期和结束日期列,在某些地方开始日期等于前一行的结束日期,没有间隔。我正在尝试获取它,以便基本上从结束日期为空的开始日期行开始,有点“ zig-zag”,直到开始日期与结束日期不匹配为止。

我尝试过CTE,并尝试ROW_NUMBER()OVER()。

START_DTE                   END_DTE
2018-01-17                  2018-01-19
2018-01-26                  2018-02-22
2018-02-22                  2018-08-24
2018-08-24                  2018-09-24
2018-09-24                  NULL

预期:

START_DTE                   END_DTE
2018-01-26                  2018-09-24

编辑

使用建议的解决方案并添加CTE,以确保日期没有时间。

WITH
  CTE_TABLE_NAME AS
(
  SELECT
    ID_NUM,
    CONVERT(DATE,START_DTE) START_DTE,
    CONVERT(DATE,END_DTE) END_DTE
  FROM
    TABLE_NAME
  WHERE ID_NUM = 123
)
select min(start_dte) as start_dte, max(end_dte) as end_dte, grp
from (select t.*,
             sum(case when prev_end_dte = end_dte then 0 else 1 end) over (order by start_dte) as grp
      from (select t.*,
                   lag(end_dte) over (order by start_dte) as prev_end_dte
            from CTE_TABLE_NAME t
           ) t
     ) t
group by grp;

以下查询提供了这些结果:

start_dte   end_dte      grp
2014-08-24  2014-12-19   1
2014-08-31  2014-09-02   2
2014-09-02  2014-09-18   3
2014-09-18  2014-11-03   4
2014-11-18  2014-12-09   5  
2014-12-09  2015-01-16   6 
2015-01-30  2015-02-02   7
2015-02-02  2015-05-15   8
2015-05-15  2015-07-08   9 
2015-07-08  2015-07-09   10
2015-07-09  2015-08-25   11
2015-08-31  2015-09-01   12
2015-10-06  2015-10-29   13
2015-11-10  2015-12-11   14
2015-12-11  2015-12-15   15
2015-12-15  2016-01-20   16
2016-01-29  2016-02-01   17
2016-02-01  2016-03-03   18
2016-03-30  2016-08-29   19
2016-08-30  2016-12-06   20
2017-01-27  2017-02-20   21
2017-02-20  2017-08-15   22
2017-08-15  2017-08-29   23
2017-08-29  2018-01-17   24
2018-01-17  2018-01-19   25
2018-01-26  2018-02-22   26
2018-02-22  2018-08-24   27
2018-08-24  2018-09-24   28
2018-09-24  NULL         29

我尝试按照建议使用count(*)> 1,但未提供结果

预期的例子

START_DTE   END_DTE
2017-01-27  2018-01-17
2018-01-26  2018-09-24

1 个答案:

答案 0 :(得分:0)

您可以通过查找相邻行未连接的地方来确定一组连接的行从何处开始。这些开始的累积总和便为您提供了分组。

select min(start_dte) as start_dte, max(end_dte) as end_dte
from (select t.*,
             sum(case when prev_end_dte = start_dte then 0 else 1 end) over (order by start_dte) as grp
      from (select t.*,
                   lag(end_dte) over (order by start_dte) as prev_end_dte
            from t
           ) t
     ) t
group by grp;

如果只想增加连接的行(如您的问题所暗示),则将having count(*) > 1添加到外部查询中。

Here是db <>小提琴。