我有如下数据。需要查找最近连续期间内处于活动状态的人员的最小日期
场景1
NAME | STARTDATE | END DATE
--------------------------------------名称|2016-01| 31-DEC-2017名称| 01-JAN-2017 | 31-OCT-2018名称| 01-JAN-2018 | 31-DEC-2019名称| 01-JAN-2019 | 31-DEC-2020
我需要如下输出:
NAME | STARTDATE | END DATE
--------------------------------------
MIKE | 01-01-2018 | 31-12-2020场景2:-
NAME | STARTDATE | END DATE
--------------------------------------名称| 01-01-2016 | 31-DEC-2017名称| 01-01-2017 | 31-OCT-2018名称| 01-01-2018 | 31-DEC-2019名称| 01-01-2019 | 31-DEC-2020我需要输出为:
NAME | STARTDATE | END DATE
--------------------------------------名称| 01-01-2019 | 31-12-2020
所以基本上输出是该人员最近连续期间的MIN和MAX。
发布于 2020-10-16 19:30:04
嗯。。。我认为你可以用下面的逻辑来做到这一点:
select name, max(startdate), max_enddate
from (select t.*,
lag(enddate) over (partition by name order by startdate) as prev_enddate,
max(enddate) over (partition by name) as max_enddate
from t
) t
where startdate <= prev_enddate + interval '1 day'
group by name, max_enddate;子查询只获取前一个结束日期和overrall结束日期。
外部查询做两件事:
Here是一个db<>fiddle
发布于 2020-10-16 16:31:16
这是一个缝隙和岛屿的问题。这里有一种方法,它使用lag()和累积的sum()来构建组,然后根据每个name过滤第一个组
select name, min(startdate) startdate, max(enddate) enddate
from (
select t.*,
sum(case when startdate = lag_enddate + interval '1 day' or lag_enddate is null then 0 else 1 end) over(partition by name order by startdate) grp
from (
select t.*,
lag(enddate) over(partition by name order by startdate) lag_enddate
from mytable t
) t
) t
where grp = 0
group by namehttps://stackoverflow.com/questions/64385490
复制相似问题