Это классический (и довольно старый) SQL-запрос для получения nth самой высокой зарплаты.Я предполагаю, что он больше не используется (я не видел) ни в каких производственных кодах, но может быть любимым вопросом среди интервьюеров.
N, на который вы ссылаетесь, - это не столбец или некая неизвестная сущность, а заполнитель, который должен преобразовываться в действительный аргумент целого числа или связывания в рабочем запросе.Это коррелированный подзапрос , подзапрос, который оценивается один раз для каждой строки, обработанной внешним запросом.Как это работает, так это то, что он берет подсчет отдельных списков значений зарплаты от сотрудников, у которых зарплата больше, чем у каждого из сотрудников, поступающих из внешнего запроса, и ограничивает результат, когда это количество равно N-1. Что означает, что выполучить эти строки с n-й наивысшей зарплатой.
Более распространенный способ сделать это - использовать аналитическую функцию dense_rank()
(или rank
в зависимости от ваших потребностей).Прочтите документацию по этим функциям, если вы о них не знаете.
SELECT first_name,
salary
FROM (
SELECT e.*,
dense_rank() OVER(
ORDER BY salary desc
) rn
FROM employees e
)
WHERE rn = 6; -- ( n = 6 )
В Oracle 12c и более поздних версиях, хотя вышеуказанный запрос работает, удобной опцией для использования является синтаксис FETCH..FIRST
.
SELECT *
FROM employees
ORDER BY salary DESC OFFSET 6 ROWS FETCH FIRST 1 ROWS WITH TIES; --n=6