#sql #postgresql #window-functions
#sql #postgresql #window-функции
Вопрос:
У меня есть база данных с идентификатором домена, зарплатой и датой получения зарплаты в организации. Мой вопрос в том, что мне нужно найти 5 самых высоких зарплат для каждого домена, но количество строк (5 строк) может увеличиться до большего, если ближайшие 6, 7 или более строк имеют то же значение, что и 5-я строка. Я попытался использовать функцию window.
выберите * from (ВЫБЕРИТЕ id_domain, salary_value, salary_date, dense_rank() ПОВЕРХ ( РАЗДЕЛЕНИЕ По ПОРЯДКУ id_domain По salary_date DESC, salary_value desc ) КАК comment_rank от employee) employee, где comment_rank <=5
Я пытался использовать lag и lead в этом контексте, все еще не мог понять это
select * from (SELECT id_domain,salary_value, salary_value - lag(salary_value)
OVER (
PARTITION BY id_domain
ORDER BY salary_value desc
) AS diff, row_number() over (partition by id_user order by salary_value desc) as rowrank
FROM employee)as t
case when rowrank > 5
where (case when diff <> 0 then rowrank > 5 else false end)
Ответ №1:
Используйте rank()
. Если вы хотите 5 , то:
select *
from (select id_domain,salary_value,
salary_value - lag(salary_value) over (partition by id_domain order by salary_value desc) AS diff,
rank() over (partition by id_user order by salary_value desc) as rowrank
from employee)as t
) t
where rowrank < 6;
или:
where rowrank <= 5
Комментарии:
1. Большое вам спасибо, Гордон.. Я недооценил rank () : D