Выбрать из KK_SALARY:
- последнюю дату изменения зарплаты по всем сотрудникам;
- последнюю (по дате DT) зарплату по всем сотрудникам;
- последнюю + предпоследнюю + пред-пред-последнюю зарплату в одной строке для каждого сотрудника.
Создадим таблицу:
CREATE TABLE KK_SALARY(NAME varchar2(50), DT date, WAGE number);
Заполним ее данными:
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Иванов', to_date('01.01.2001','DD.MM.YYYY'), 1000 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Иванов', to_date('01.07.2007','DD.MM.YYYY'), 1400 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Иванов', to_date('01.08.2008','DD.MM.YYYY'), 1600 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Иванов', to_date('01.10.2010','DD.MM.YYYY'), 1500 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Петров', to_date('01.01.2004','DD.MM.YYYY'), 3000 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Петров', to_date('01.01.2005','DD.MM.YYYY'), 2500 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Петров', to_date('01.01.2010','DD.MM.YYYY'), 1700 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Петров', to_date('01.01.2011','DD.MM.YYYY'), 1400 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Рябов', to_date('15.07.2003','DD.MM.YYYY'), 15 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Рябов', to_date('21.04.2009','DD.MM.YYYY'), 1050 );
Insert into KK_SALARY (NAME, DT, WAGE) Values ('Рябов', to_date('11.01.2012','DD.MM.YYYY'), 100500 );
Напишем запрос, решающий задачу, применив аналитические функции.
Во внутреннем подзапросе q1 для каждой строки находим row_number() - номер строки в разбиении по name и сортировке по dt по убыванию.
lag(wage, 1) и lag(wage, 2) соответственно выдают предпоследнюю и пред-пред-последнюю зарплату в разбиении по name и сортировке по dt по возрастанию:
select name,
dt last_salary_change_date,
wage last_wage,
list_of_3_last_wages
from (select name,
dt,
wage,
row_number() over(partition by name order by dt desc) rn,
wage || ' <- ' || lag(wage, 1) over(partition by name order by dt) || ' <- ' || lag(wage, 2) over(partition by name order by dt) list_of_3_last_wages
from kk_salary
order by name, dt desc) q1
where rn = 1;