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
| SQL> with t as (select 'X' unit, '15/10' dat, 'A' lieu from dual
2 union select 'X' unit, '15/10' dat, 'A' lieu from dual
3 union select 'X' unit, '10/10' dat, 'A' lieu from dual
4 union select 'X' unit, '05/10' dat, 'A' lieu from dual
5 union select 'X' unit, '08/09' dat, 'B' lieu from dual
6 union select 'X' unit, '02/09' dat, 'C' lieu from dual
7 union select 'X' unit, '05/08' dat, 'C' lieu from dual
8 union select 'X' unit, '02/07' dat, 'A' lieu from dual
9 union select 'X' unit, '06/07' dat, 'A' lieu from dual
10 union select 'Y' unit, '15/10' dat, 'B' lieu from dual
11 union select 'Y' unit, '08/10' dat, 'B' lieu from dual
12 union select 'Y' unit, '15/09' dat, 'A' lieu from dual)
13 select * from (
14 select t.*,
15 LAG (lieu) OVER (PARTITION BY unit ORDER BY TO_DATE(dat,'dd/mm') DESC) suivant,
16 ROW_NUMBER () OVER (PARTITION BY unit ORDER BY TO_DATE(dat,'dd/mm') DESC) rn,
17 ROW_NUMBER () OVER (PARTITION BY unit,lieu ORDER BY TO_DATE(dat,'dd/mm') DESC) rn2
18 FROM t
19 ORDER BY unit
20 )
21 where rn=rn2 and (lieu=suivant or suivant is null);
U DAT L S RN RN2
- ----- - - ---------- ----------
X 15/10 A 1 1
X 10/10 A A 2 2
X 05/10 A A 3 3
Y 15/10 B 1 1
Y 08/10 B B 2 2 |
Partager