Как ограничить количество результатов всего 5 на «пользователя», но разрешить больше строк, если непосредственное значение в 5-й строке совпадает с последовательными строками?

#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