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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
SQL> SELECT * FROM source ORDER BY matricule,contrat,date_debut;
MATRICULE CONTRAT DATE_DEBUT
---------- ---------- ----------
001 001 2008-01-01
001 001 2008-01-02
001 001 2008-01-04
001 001 2008-01-05
001 001 2008-01-07
001 001 2008-01-09
001 001 2008-01-10
001 002 2008-01-07
001 002 2008-01-08
001 002 2008-01-09
001 002 2008-01-11
MATRICULE CONTRAT DATE_DEBUT
---------- ---------- ----------
001 002 2008-01-12
001 002 2008-01-14
001 002 2008-01-15
001 002 2008-01-18
001 002 2008-01-19
001 002 2008-01-20
001 002 2008-01-22
18 ligne(s) sélectionnée(s).
SQL> SELECT MATRICULE, DATE_DEBUT, CHAINE AS DATE_FIN ,CONTRAT
2 FROM (
3 SELECT contrat, matricule,
4 MAX (opt) OVER (PARTITION BY matricule, contrat ORDER BY date_debut)
5 grp,
6 date_debut
7 FROM (SELECT contrat, matricule, ind, date_debut,
8 CASE
9 WHEN ind >= 2
10 THEN MAX (ind) OVER (PARTITION BY matricule, contrat ORDER BY date_debut
)
11 + ROW_NUMBER () OVER (PARTITION BY matricule, contrat ORDER BY date_d
ebut)
12 ELSE ind
13 END opt
14 FROM (SELECT contrat, matricule, date_debut,
15 NVL
16 ( date_debut
17 - LAG (date_debut, 1) OVER (PARTITION BY matricule, contrat ORDER BY
date_debut),
18 1
19 ) ind
20 FROM SOURCE)) ) T
21 MODEL
22 RETURN UPDATED ROWS
23 PARTITION BY ( CONTRAT, MATRICULE ,grp)
24 DIMENSION BY ( ROW_NUMBER() OVER (PARTITION BY MATRICULE,CONTRAT,grp ORDER BY
25 DATE_DEBUT ASC) AS POSITION )
26 MEASURES (DATE_DEBUT, CAST( DATE_DEBUT AS VARCHAR2(12)) AS
27 CHAINE) IGNORE NAV
28 RULES
29 UPSERT
30 ITERATE( 100)
31 UNTIL ( PRESENTV(CHAINE[ITERATION_NUMBER+2],1,0) = 0)
32 (
33 CHAINE[1] = CHAINE[ ITERATION_NUMBER+1]
34 )
35 ORDER BY MATRICULE,CONTRAT,date_debut
36
SQL> /
MATRICULE DATE_DEBUT DATE_FIN CONTRAT
---------- ---------- ------------ ----------
001 2008-01-01 2008-01-02 001
001 2008-01-04 2008-01-05 001
001 2008-01-07 2008-01-07 001
001 2008-01-09 2008-01-10 001
001 2008-01-07 2008-01-09 002
001 2008-01-11 2008-01-12 002
001 2008-01-14 2008-01-15 002
001 2008-01-18 2008-01-20 002
001 2008-01-22 2008-01-22 002
9 ligne(s) sélectionnée(s).
SQL> |
Partager