【问题标题】:Following Start and End Date Columns跟随开始和结束日期列
【发布时间】:2019-04-09 22:58:46
【问题描述】:

我有开始日期和结束日期列,并且有一些开始日期等于前一行的结束日期而没有间隔。我正在尝试获取它,以便它基本上从结束日期为空的开始日期行开始,并且有点“之字形”,直到开始日期与结束日期不匹配。

我尝试过 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

【问题讨论】:

  • 您的尝试有什么问题?你收到错误了吗?您尝试的确切代码是什么,结果有什么问题?
  • 使用问题中提到的方法尝试各种解决方案均失败。这更像是一个一般指导的问题,以便找到解决方案,因为我所做的并没有做太多。并且不会“展平”具有连接日期的列。

标签: sql sql-server


【解决方案1】:

您可以通过查找相邻行的位置未连接来确定连接行组的起始位置。这些开始的累积总和会为您提供组。

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 是一个 dbfiddle。

【讨论】:

  • 嗨!感谢您提出的解决方案。我实现了它,并在编辑我的原始问题时提供了结果。我尝试将 prev_end_dte = end_dte 与 prev_end_dte = start_dte 交换,它提供了不同的 grp 结果,但仍然无法正确折叠。
  • @jhsh 。 . .我已经在您的一些示例数据中包含了一个 dbfiddle,并且代码似乎可以正常工作(更改为 case 条件)。
  • 再次感谢。我一定有什么不同的地方,但是确实有效!
猜你喜欢
  • 2023-03-17
  • 2012-08-19
  • 2022-01-23
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多