Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

SQL. Оконные функции

Bonditka Ученик (230), на голосовании 2 года назад
Задача: Найти департаменты, в которых средняя зарплата от года к году только падает .

Часть решения (посчитала среднюю зарплату внутри департамента по годам):
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

Нужно доработать КОД так, чтобы запрос вывел департаменты, в которых средняя зарплата от года к году только падает.
Помогите решить.
Голосование за лучший ответ
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
)
Jurijus ZaksasИскусственный Интеллект (445791) 2 года назад
Угу. А если у нас зарплата не за каждый год есть и твой +1 не катит?
Vasyok Просветленный (20077) Jurijus Zaksas, ну там надо условие гдето еще поставить на ноль проверять, такое надо на данных отлаживать
Jurijus Zaksas Искусственный Интеллект (445791) 2 года назад
Я тебе уже в прошлый раз примерный код отправлял - что с ним плохо-то?
BonditkaУченик (230) 2 года назад
не смогла адаптировать под свои параметры.
совсем новичок.
:)
Прошу прощения.
Похожие вопросы