Используйте аналитическую функцию DENSE_RANK
, чтобы найти 3-ую самую высокую зарплату, и аналитическую функцию ROW_NUMBER
(или RANK
или DENSE_RANK
) с предложением PARTITION BY
, чтобы найти самый высокий опыт на зарплату.Для этого требуется только одно сканирование таблицы / индекса.
Установка Oracle :
CREATE TABLE table_name ( Name, Salary, Experience ) AS
SELECT 'Den', 11000, 114 FROM DUAL UNION ALL
SELECT 'Gerald', 11000, 148 FROM DUAL UNION ALL
SELECT 'Ellen', 11000, 174 FROM DUAL UNION ALL
SELECT 'Eleni', 10500, 149 FROM DUAL UNION ALL
SELECT 'Clara', 10500, 162 FROM DUAL UNION ALL
SELECT 'Janette', 10000, 156 FROM DUAL UNION ALL
SELECT 'Peter', 10000, 150 FROM DUAL UNION ALL
SELECT 'Hermann', 10000, 204 FROM DUAL UNION ALL
SELECT 'Harrison', 10000, 169 FROM DUAL
Запрос : если вы хотите найти "человекаимея максимальный опыт работы в 3-й категории наивысшей зарплаты ":
SELECT Name, Salary, Experience
FROM (
SELECT t.*,
DENSE_RANK() OVER ( ORDER BY Salary DESC ) AS s_rank,
ROW_NUMBER() OVER ( PARTITION BY Salary ORDER BY Experience DESC )
AS Exp_rownum
FROM table_name t
)
WHERE s_rank = 3
AND Exp_rownum = 1;
Если вы поменяете аналитическую функцию ROW_NUMBER()
на RANK()
или DENSE_RANK()
, тогда будет возвращено несколько человек, если они связаны сСовместный наивысший опыт работы в 3-й категории наивысшей зарплаты.
Вывод :
NAME | SALARY | EXPERIENCE
:------ | -----: | ---------:
Hermann | 10000 | 204
Запрос : если вы хотите найти "человека, имеющегоМаксимальный опыт и (также) в 3-й категории наивысшей зарплаты ":
Просто возьмите запрос выше и удалите предложение PARTITION BY
.
SELECT Name, Salary, Experience
FROM (
SELECT t.*,
DENSE_RANK() OVER ( ORDER BY Salary DESC ) AS s_rank,
ROW_NUMBER() OVER ( ORDER BY Experience DESC ) AS Exp_rownum
FROM table_name t
)
WHERE s_rank = 3
AND Exp_rownum = 1;
Вывод :
(Примечание: если опыт Германа был 173, то это не вернуло бы ни одной строки, так как у Эллен был бы самый высокий опыт, но она не была бы в третьей самой высокой шкале зарплаты, а Герман был бы в третьей самой высокойзарплата, но будет иметь только 2-й самый высокий опыт.)
NAME | SALARY | EXPERIENCE
:------ | -----: | ---------:
Hermann | 10000 | 204
дБ <> скрипка здесь