sql - 如何在不中断时间的情况下结合开始日期和结束日期?
问题描述
我尝试了很多方法,但都没有成功,将记录 ID 相同的开始日期和结束日期结合起来,并将日期中没有中断的地方结合起来
CREATE TABLE #t (
A_ID VARCHAR(100),
BDate VARCHAR(100),
CDate VARCHAR(100)
)
INSERT INTO #T
(A_ID, BDate, CDate)
VALUES
('1000','2017/12/01','2017/12/31'),
('1000','2018/01/01','2018/03/31'),
('1000','2018/05/01','2018/05/31')
Select A_ID, bDate,cDate from
(
select BDate,A_ID,Cdate,lead(Bdate) over (order by Bdate) next_BDate from #T as t2
where exists ( select null from #T as t1
where t1.A_ID = t2.A_ID and t1.Bdate <= t2.Bdate and t1.CDate <=t2.CDate )
) as combine
where bDate < Cdate
order by BDate;
我想看看:
1000 2017/12/01 2018/03/31 (no break in first two dates)
1000 2018/05/01 2018/05/31 (Break between 4-1-18 and 5-1-18)
解决方案
这是一个差距和孤岛问题,取决于您的实际数据,基于嵌套 OLAP 函数的解决方案可能比递归更有效:
with combine as
(
select BDate,A_ID,Cdate,
-- find the gap and flag it
case when lag(Cdate)
over (partition by A_ID
order by CDate) = dateadd(day,-1, BDate)
then 0
else 1
end as flag
from T
)
, groups as
(
Select A_ID, bDate,cDate,
-- cumulative sum over 0/1 to assign the same group number for row without gaps
sum(flag)
over (partition by A_ID
order by Bdate) as grp
from combine
)
-- group consecutive rows into one
select A_ID, min(BDate), max(CDate)
from groups
group by A_ID, grp
order by min(BDate);
推荐阅读
- azure - 通过 ARM 模板为应用服务使用 Key Vault 引用
- node.js - 模拟 ES6 BigQuery 类
- javascript - 将 UTM 参数传递到网页内容中
- python-3.x - 使用 Python 动态管理 YAML 文件中的密钥解析
- javascript - 修复从右到左语言切换时 Atom 光标的行为
- angular - Angular 9:从 ElementRef 获取组件
- javascript - 如何从 Django 模板发送变量以查看
- jenkins - Jenkins管道停止时JUnit @After不执行
- python - 尝试读取文件,实际文件具有正确的文本, .read() 什么也不显示:
- javascript - 链接多个“transitionend”事件监听器