Vasyok
Просветленный
(20077)
2 года назад
зарплата нанятых в каждому году штоле?
--справочник отдел-год
with (lookup) as
(select
distinct(t1.department_id) as department_id,
distinct(extract(t2.hire_date)) as year --или как там год получешь
from employees t1
cross join
employees t2)
--нужно групировать по сразу по отдел-году по этому нужно будет джоинить на этот справочник, иначе ногу сломишь с партициями
--дальше джоиним 2 одинаковых таблицы средних по годам со сдвигом на один год
--из списка отделов вычитаем те в которых хоть раз не понилизалсь
select distinct(department_id) from empoyees
exept
(
select department_id
from
(
select
this_year_table.department_id,
this_year_table.avgs as this_year,
last_year_table.avgs as last_year
from
(
select
t.department_id,
t.AVG(salary) as avgs,
extract(t.hire_date) as year
--встаем на каждую пару отдел-год в справочнике и считаем для нее среднюю
from lookup l
inner join
employees t
on l.department_id=t.department_id
and
l.year=t.year
)
this_year_table
inner join
(
--тут копия прошлой таблицы, база соптимизирует этот запрос
select
t.department_id,
t.AVG(salary) as avgs,
extract(t.hire_date) as year
--встаем на каждую пару отдел-год в справочнике и считаем для нее среднюю
from lookup l
inner join
employees t
on l.department_id=t.department_id
and
l.year=t.year
)
last_year_table
on
this_year_table.department_id=last_year_table.department_id
and
this_year_table.year=1+last_year_table.year
)
t
--факт того что зарплата хоть раз не понизилась
where this_year>=last_year
)
Часть решения (посчитала среднюю зарплату внутри департамента по годам):
SELECT department_id,
hire_date,
salary,
extract(YEAR from hire_date) GOD,
round(AVG(salary) over (partition by department_id, extract(YEAR from hire_date)), 2) AVG_GOD FROM employees
Нужно доработать КОД так, чтобы запрос вывел департаменты, в которых средняя зарплата от года к году только падает.
Помогите решить.