Вот один из вариантов;он
- находит предыдущие
height
(для item_no
, упорядоченные по date
) (строка № 14) - сортирует эти значения (строка № 15) - это будетиспользуется для отображения самого первого значения в наборе
- возвращает строки
- , чья "предыдущая" и "текущая" высота не совпадают (строка № 20)
- , которыесначала в наборе (строка № 21)
- , но эти элементы должны быть в наборе, который имеет разную высоту (строки № 23 - 25) (это условие исключает
item_no = 2
)
Вот, пожалуйста:
SQL> with test (item_no, effective_date, height) as
2 (select 1, date '1980-01-01', '01' from dual union all
3 select 2, date '1985-03-16', '02' from dual union all
4 select 1, date '1985-07-03', '01' from dual union all
5 select 3, date '1986-08-01', '03' from dual union all
6 select 1, date '1986-08-03', '02' from dual union all
7 select 3, date '1986-09-01', '04' from dual union all
8 select 2, date '1987-09-20', '02' from dual union all
9 select 3, date '1987-10-01', '04' from dual union all
10 select 1, date '2000-06-18', '03' from dual
11 ),
12 temp as
13 (select item_no, effective_date, height,
14 lag(height) over (partition by item_no order by effective_date) lheight,
15 row_number() Over (partition by item_no order by effective_date) rn
16 from test
17 )
18 select item_no, effective_date
19 from temp
20 where ( height <> lheight
21 or rn = 1
22 )
23 and item_no in (select item_no from temp
24 group by item_no
25 having count(distinct height) > 1
26 )
27 order by item_no, effective_date;
ITEM_NO EFFECTIVE_
---------- ----------
1 01/01/1980
1 08/03/1986
1 06/18/2000
3 08/01/1986
3 09/01/1986
SQL>