1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| WITH t AS (
SELECT pers, couleur, date_debut, date_fin,
lag(couleur) over (partition BY pers ORDER BY date_debut) AS prev_couleur,
lead(couleur) over (partition BY pers ORDER BY date_debut) AS next_couleur,
case when couleur <> nvl(lag(couleur) over (partition BY pers ORDER BY date_debut),'ZZZ')
AND couleur = nvl(lead(couleur) over (partition BY pers ORDER BY date_debut),couleur)
then row_number() over (partition BY pers ORDER BY date_debut)
end AS debut_liste
FROM latable
)
SELECT pers,
max(couleur) keep (dense_rank first order by debut_liste desc),
max(date_debut) keep (dense_rank first order by debut_liste desc),
max(date_fin) keep (dense_rank first order by debut_liste desc)
FROM t
WHERE couleur = 'vert'
AND pers IN (SELECT pers
FROM t
WHERE couleur = 'vert'
AND next_couleur IS NULL)
group by pers |