sql - 根据日期范围查找至少 2 个连续项目
问题描述
有很多类似问题的解决方案,但仅基于一个日期列。
我想知道可能更好的解决方案来解决这个问题,我附上了我的解决方案,但如果你知道更好的方法,我觉得它有点复杂,请发布它。
这是包含 2 个项目的开始和结束日期的订单表。我想根据日期和项目打印至少 2 个连续的行。
ITEM , START , END
1. A, 01.01.2020, 31.01.2020
2. A, 01.02.2020, 31.03.2020
3. B, 01.02.2020, 30.04.2020
4. A, 01.05.2020, 30.06.2020
5. B, 01.06.2020, 31.07.2020
6. B, 01.09.2020, 30.09.2020
7. A, 01.08.2020, 31.10.2020
8. B, 01.10.2020, 31.10.2020
9. B, 01.11.2020, 31.12.2020
项目 A 的输出应该是第 1 行和第 2 行,项目 B 的输出应该是第 6,8 和 9 行
这是我的方法
with pool as (
select ITEM, START_DATE, END_DATE,
nvl(lag(end_date,1) over (partition by item order by end_date),START_DATE-1) prev_End_Date
from orders )
, pool2 as (
select item ,
START_DATE, END_DATE,
sum(case when PREV_END_DATE+1 = START_DATE then 0 else 1 end ) over (partition by item order by START_DATE) grp
from pool )
select item,start_date,end_date from (
select
ITEM,
START_DATE,
END_DATE,
grp,
count(grp) over (partition by item,grp ) cnt
from pool2)
where cnt>=2
;
解决方案
嗯。. . 使用lag()
andlead()
查看下一个/上一个值并检查它们是否匹配:
select o.*
from (select o.*,
lag(end) over (partition by product order by start) as prev_end,
lead(start) over (partition by product order by start) as next_start
from orders o
) o
where start = prev_end + interval '1' day or
end = next_start - interval '1' day;
推荐阅读
- java - 如何将 2 个服务器作为单独的进程运行?
- java - maven 如何通过使用 mvn compile 找出更改了哪些文件
- xml - 我应该如何表示一个负金额的 UBL 订单行?
- java - 公共方法不返回变量
- mysql - 更新查询不更新mysql(wordpress)中的数据
- ssis - 执行包任务 - 有没有办法将子包参数绑定到常量?
- typescript - 无法通过量角器上传文件?
- ruby-on-rails - 如何从 Rails 控制台使用 Rails 关联?
- tensorflow - 我应该从输入特征中修剪异常值吗
- rust - Rust “预期类型”错误打印出完全相同的不匹配类型