【发布时间】: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