初始数据:
SELECT RCMOUVNT.MATRICULE, RCMOUVNT.DATENT, RCMOUVNT.DATOUT FROM RCMOUVNT
WHERE RCMOUVNT.MATRICULE = '81123404' order by DATENT asc;
MATRICULE DATENT DATOUT
81123404 04/09/17 30/11/17
81123404 01/12/17 31/07/18
81123404 01/02/19 31/01/20
使用SQL的预期结果:
MATRICULE DATENT DATOUT
81123404 04/09/17 31/07/18
81123404 01/02/19 31/01/20
我知道这是一个“鸿沟和孤岛”的问题,但我找不到任何答案。
发布于 2019-02-01 21:11:38
使用以下步骤的一种可能的解决方案
DATENT
匹配之前将前一行的DATAOUT
添加1天,才能获得您的logik。此外,第一行使用NVL
.LAST_VALUE
GROUP BY
和MIN
。获取结果的MAX
。。
with q1 as (
select
MATRICULE,
DATENT,
DATOUT,
case when (nvl(lag(DATOUT +1) over (partition by MATRICULE order by DATENT),DATE'2500-01-01') <> DATENT) then
row_number() over (partition by MATRICULE order by DATENT) end grp
from RCMOUVNT
), q2 as (
select
MATRICULE,
DATENT,
DATOUT,
grp,
last_value(grp ignore nulls) over (partition by MATRICULE order by DATENT) as grp2
from q1
)
select
MATRICULE,
min(DATENT) DATENT,
max(DATOUT) DATOUT
from q2
group by MATRICULE, grp2
order by 1
MATRICULE DATENT DATOUT
---------- ------------------- -------------------
81123404 04.09.2017 00:00:00 31.07.2018 00:00:00
81123404 01.02.2019 00:00:00 31.01.2020 00:00:00
https://stackoverflow.com/questions/54479837
复制相似问题