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 56 57 58 59 60 61 62 63
|
WITH DATA(numadh, period) AS (
SELECT '00258975', 'T12020' FROM DUAL
UNION ALL
SELECT '00258975', 'T42021' FROM DUAL
UNION ALL
SELECT '00258900', 'M012020' FROM DUAL
UNION ALL
SELECT '00258900', 'M122021' FROM DUAL
UNION ALL
SELECT '00258000', 'M122019' FROM DUAL
UNION ALL
SELECT '00258000', 'M122021' FROM DUAL
)
SELECT numadh, type_cotisation, start_gap AS start_gap, end_gap AS end_gap,
type_cotisation ||
CASE type_cotisation
WHEN 'M' THEN
LPAD(EXTRACT(MONTH FROM start_gap),2,'0')
ELSE
TO_CHAR(TRUNC(EXTRACT(MONTH FROM start_gap) / 3,0) + 1)
END || EXTRACT(YEAR FROM start_gap)
|| ' to ' || type_cotisation ||
CASE type_cotisation
WHEN 'M' THEN
LPAD(EXTRACT(MONTH FROM end_gap),2,'0')
ELSE
TO_CHAR(TRUNC(EXTRACT(MONTH FROM end_gap) / 3,0))
END || EXTRACT(YEAR FROM start_gap)
AS diag
FROM (
SELECT
numadh, type_cotisation,
ADD_MONTHS(TRUNC(TO_DATE(year,'YYYY'),'YYYY'),start_month) AS start_date,
ADD_MONTHS(TRUNC(TO_DATE(year,'YYYY'),'YYYY'),end_month) - (1/(24*3600)) AS end_date
FROM (
SELECT
numadh,
SUBSTR(period,1,1) AS type_cotisation,
CASE substr(period,1,1) WHEN 'T'
THEN 3*(TO_NUMBER(substr(period,2,1))-1)
ELSE
TO_NUMBER(SUBSTR(period,2,2))-1
END AS start_month,
CASE SUBSTR(period,1,1) WHEN 'T'
THEN 3*TO_NUMBER(SUBSTR(period,2,1))
ELSE
TO_NUMBER(substr(period,2,2))
END AS end_month,
TO_NUMBER(SUBSTR(period,-4)) AS year
FROM data
)
)
MATCH_RECOGNIZE(
PARTITION BY numadh
ORDER BY start_date
MEASURES MAX(end_date) + (1/(24*3600)) start_gap, NEXT(start_date) - (1/(24*3600)) end_gap
ALL ROWS PER MATCH
PATTERN((A| {- B -} )+)
DEFINE A AS MAX(end_date) < NEXT(start_date) - (1/(24*3600))
)
; |
Partager