我需要对时间线进行分组。这意味着,所有内容都应该在同一组中(C,I,"A"(。如果"A"的值已更改,则它是一个新组。
我已经尝试了许多Oracle的想法,比如分析函数和分组;但我没有得到我想要的结果。
没有可用的代码
原始数据:
C I A FROM_DATE TO_DATE 1 1 4 01.08.19 00:00 05.08.19 00:00 1 1 4 06.08.19 00:00 10.08.19 00:00 1 1 6 11.08.19 00:00 17.08.19 00:00 1 1 5 18.08.19 00:00 21.08.19 00:00 1 1 5 22.08.19 00:00 28.08.19 00:00 1 1 5 29.08.19 00:00 05.09.19 00:00 1 1 4 06.09.19 00:00 31.12.99 00:00
预期(中级(:
C I A FROM_DATE TO_DATE GROUP_ID 1 1 4 01.08.19 00:00 05.08.19 00:00 1 1 1 4 06.08.19 00:00 10.08.19 00:00 1 1 1 6 11.08.19 00:00 17.08.19 00:00 2 1 1 5 18.08.19 00:00 21.08.19 00:00 3 1 1 5 22.08.19 00:00 28.08.19 00:00 3 1 1 5 29.08.19 00:00 05.09.19 00:00 3 1 1 4 06.09.19 00:00 31.12.99 00:00 4
预期(最终(:
C I A FROM_DATE TO_DATE 1 1 4 01.08.19 00:00 10.08.19 00:00 1 1 6 11.08.19 00:00 17.08.19 00:00 1 1 5 18.08.19 00:00 05.09.19 00:00 1 1 4 06.09.19 00:00 31.12.99 00:00
你可以使用Tabibitosan:
select t.*,
row_number() over (order by from_date)
- row_number() over (partition by c, i, a order by from_date) as grp
from your_table t;
C I A FROM_DATE TO_DATE GRP
---------- ---------- ---------- ---------- ---------- ----------
1 1 4 2019-08-01 2019-08-05 0
1 1 4 2019-08-06 2019-08-10 0
1 1 6 2019-08-11 2019-08-17 2
1 1 5 2019-08-18 2019-08-21 3
1 1 5 2019-08-22 2019-08-28 3
1 1 5 2019-08-29 2019-09-05 3
1 1 4 2019-09-06 1999-12-31 4
组号并不完全是你所拥有的,但因为它是一个中间结果,并不重要。
然后将其用于聚合:
select c, i, a, min(from_date) as from_date, max(to_date) as to_date
from (
select t.*,
row_number() over (order by from_date)
- row_number() over (partition by c, i, a order by from_date) as grp
from your_table t
)
group by c, i, a, grp
order by c, i, from_date;
C I A FROM_DATE TO_DATE
---------- ---------- ---------- ---------- ----------
1 1 4 2019-08-01 2019-08-10
1 1 6 2019-08-11 2019-08-17
1 1 5 2019-08-18 2019-09-05
1 1 4 2019-09-06 1999-12-31
数据库<>小提琴