Что ж, ваша модель данных неверна;Вы не должны полагаться на различение людей по их именам.Что, если еще один «Джон Доу» устроится на работу?
В любом случае: будет ли что-то подобное делать?
- CTE
T1
и T2
имитируют ваши таблицы.Я добавил еще несколько строк, просто чтобы удостовериться, , что следующий запрос тоже не провалится слишком очевидно INTER
CTE объединяет эти две таблицы и вычисляет предыдущую зарплату сотрудника (используя LAG
function) - последний запрос выбирает строки (из
INTER
), чьи текущая и предыдущая зарплата отличаются
Поскольку у вас уже есть эти таблицы, вы будете использовать строки 16 и далее.
SQL> with
2 t1 (id, fn, ln) as
3 (select 1, 'John', 'Doe' from dual union all
4 select 2, 'John', 'Doe' from dual union all
5 select 3, 'John', 'Doe' from dual union all
6 select 5, 'Billy', 'Jean' from dual union all
7 select 6, 'Billy', 'Jean' from dual
8 ),
9 t2 (id, salary, c_date) as
10 (select 1, 1, 2015 from dual union all
11 select 2, 2, 2018 from dual union all
12 select 3, 2, 2019 from dual union all
13 select 5, 3, 2016 from dual union all
14 select 6, 3, 2017 from dual
15 ),
16 inter as
17 (select
18 t1.id, t1.fn, t1.ln,
19 t2.id, t2.salary, t2.c_date,
20 lag(t2.salary) over (partition by t1.fn, t1.ln
21 order by c_date) prev_salary
22 from t1 join t2 on t1.id = t2.id
23 )
24 select i.fn, i.ln, i.salary, i.c_date
25 from inter i
26 where i.salary <> nvl(i.prev_salary, i.salary)
27 order by i.ln, i.c_date;
FN LN SALARY C_DATE
----- ---- ---------- ----------
John Doe 2 2018
SQL>