sql - 行集总,周期日期
问题描述
我想查看lead
类型,如果该类型与该行相同,则合并这些日期以适合一行。
我有下表:
id start_dt end_dt type
1 1/1/19 2/21/19 cross
1 2/22/19 6/5/19 cross
1 6/6/19 8/31/19 cross
1 9/1/19 10/3/19 AAAA
1 10/4/19 10/4/19 cross
1 10/5/19 10/6/19 AAAA
1 10/7/19 10/10/19 AAAA
1 10/11/19 12/31/99 cross
预期成绩:
id start_dt end_dt type
1 1/1/19 8/31/19 cross
1 9/1/19 10/3/19 AAAA
1 10/4/19 10/4/19 cross
1 10/5/19 10/10/19 AAAA
1 10/11/19 12/31/99 cross
我怎样才能让我的输出看起来像预期的结果?
我已经测试过lead
lag
rank
,case expression
但没有什么值得在这里添加的。我在正确的道路上吗?
解决方案
这是一个gaps-and-islands
问题。row_number()
通过分析函数的贡献解决它的一种选择:
select min(start_dt) as startdate, max(end_dt) as enddate, type
from
(
with t(id, start_dt, end_dt,type) as
(
select 1, date'2019-01-01', date'2019-02-21', 'cross' from dual union all
select 1, date'2019-02-22', date'2019-06-05', 'cross' from dual union all
select 1, date'2019-06-06', date'2019-08-31', 'cross' from dual union all
select 1, date'2019-09-01', date'2019-10-03', 'AAAA' from dual union all
select 1, date'2019-09-04', date'2019-10-04', 'cross' from dual union all
select 1, date'2019-10-05', date'2019-10-06', 'AAAA' from dual union all
select 1, date'2019-10-07', date'2019-10-10', 'AAAA' from dual union all
select 1, date'2019-10-11', date'2019-12-31', 'cross' from dual
)
select type,
row_number() over (partition by id, type order by end_dt) as rn1,
row_number() over (partition by id order by end_dt) as rn2,
start_dt, end_dt
from t
) tt
group by type, rn1 - rn2
order by enddate;
STARTDATE ENDDATE TYPE
--------- --------- -----
01-JAN-19 31-AUG-19 cross
01-SEP-19 03-OCT-19 AAAA
04-SEP-19 04-OCT-19 cross
05-OCT-19 10-OCT-19 AAAA
11-OCT-19 31-DEC-19 cross
推荐阅读
- react-native - 当 editable={false} 时 React Native TextInput 变得透明 - 如何防止这种行为?
- javascript - 分组和求和,并为每个数组 javascript 生成一个对象
- networking - 计算机网络:第 70 段是在哪一轮传输中发送的?
- ubuntu-server - Ubuntu 18 - Netplan - cloud.cfg 禁用问题
- powershell - 任务调度程序作业延迟
- sql-server - 当您必须构建一个从一组数据库写入/读取的应用程序时,Apache Gora 是否适合?
- css - Fluent Validation:在错误时更改控件样式
- c# - Elasticsearch NEST 获取任务失败
- hash - SAS MD5 散列
- sql - ORACLE SQL 从表列部分创建日期