1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| WITH debut -- La date de début de période de congés
AS ( SELECT tb1.id_personne
, tb1."type"
, tb1."date" AS debut
FROM matable tb1
WHERE tb1.conges = 'OUI'
AND NOT EXISTS -- début si jour = congés et veille != congés
( SELECT NULL
FROM matable tb2
WHERE tb2.conges = t1.conges
AND tb2."type" = t1."type"
AND tb2.id_personne = tb1.id_personne
AND tb2."date" = tb1."date" -1
)
)
, fin -- La date de fin de période de congés
AS ( SELECT tb1.id_personne
, tb1."type"
, tb1."date" AS fin
FROM matable tb1
WHERE tb1.conges = 'OUI'
AND NOT EXISTS -- fin si jour = congés et lendemain != congés
( SELECT NULL
FROM matable tb2
WHERE tb2.conges = t1.conges
AND tb2."type" = t1."type"
AND tb2.id_personne = tb1.id_personne
AND tb2."date" = tb1."date" + 1
)
)
, per_debut -- Numéroter les périodes de congés
AS ( SELECT tb1.id_personne
, tb1."type"
, tb1.debut
, ROW_NUMBER() OVER (PARTITION BY tb1.id_personne, tb1."type" ORDER BY tb1.debut) AS periode
FROM debut tb1
)
, per_fin
AS ( SELECT tb1.id_personne
, tb1."type"
, tb1.fin
, ROW_NUMBER() OVER (PARTITION BY tb1.id_personne, tb1."type" ORDER BY tb1.fin) AS periode
FROM debut tb1
)
SELECT tb1.id_personne
, tb1."type"
, tb1.periode
, tb1.debut
, tb2.fin
FROM per_debut tb1
INNER JOIN
per_fin tb2
ON tb2.id_personne = tb1.id_personne
AND tb2.periode = tb1.periode -- Regrouper les périodes
; |
Partager