Проще понять, когда вы запустите этот запрос:
select e1.*,
(select count(distinct e2.salary)
from employee e2
where e2.salary > e1.salary) as n
from employee e1
Это моя примерная таблица:
create table employee(salary) as (
select * from table(sys.odcinumberlist(1500, 1200, 1400, 1500, 1100)));
, поэтому мой вывод:
SALARY N
---------- ----------
1500 0
1200 2
1400 1
1500 0
1100 3
Как видно, подзапрос подсчитывает для каждой строки зарплаты, превышающие зарплату в текущей строке. Так, например, на 1400 год на ЗНАЧИТЕЛЬНО большую зарплату (1500). 1500 появляется в моей таблице дважды, но distinct
означает, что он считается один раз. Таким образом, 1400 - второй по порядку.
В вашем запросе этот счет перемещен в часть where
и сравнен с требуемым значением. Мы должны вычесть один, потому что для самой высокой зарплаты нет более высокого значения, для второй зарплаты одна строка et c.
Это один из методов, используемых для поиска таких значений, в более новых Oracle версиях введены аналитические c функции (rank, row_number, dens_rank), что исключает необходимость использования подзапросов для таких целей. Они быстрее, эффективнее. Для вашего запроса было бы полезно dense_rank()
.