Как вы пишете запрос, в котором возвращено только количество строк, выбранных с наименьшим или меньшим значением столбца.
то есть. Отчет с 5 самыми высокооплачиваемыми сотрудниками?
Как вы пишете запрос, в котором возвращено только количество строк, выбранных с наименьшим или меньшим значением столбца.
то есть. Отчет с 5 самыми высокооплачиваемыми сотрудниками?
Лучший способ сделать это - аналитические функции, RANK() или DENSE_RANK()...
SQL> select * from (
2 select empno
3 , sal
4 , rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7 /
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 4
8083 2850 5
7698 2850 5
6 rows selected.
SQL>
DENSE_RANK() сжимает промежутки, когда есть галстук:
SQL> select * from (
2 select empno
3 , sal
4 , dense_rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7 /
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 3
8083 2850 4
7698 2850 4
8070 2500 5
7 rows selected.
SQL>
Какое поведение вы предпочитаете, зависит от ваших бизнес-требований.
Существует также аналитическая функция ROW_NUMBER(), которую мы можем использовать для возврата точного числа строк. Однако нам следует избегать использования решений на основе номера строки, если бизнес-логика не сможет произвольно урезать набор результатов в случае равенства. Существует разница между запросом пяти самых высоких значений и первых пяти записей, отсортированных по высоким значениям
Существует также неаналитическое решение, использующее псевдо-столбец ROWNUM. Это неудобно, потому что ROWNUM применяется до предложения ORDER BY, что может привести к неожиданным результатам. Существует редко какая-либо причина использовать ROWNUM вместо ROW_NUMBER() или одну из ранговых функций.
Попробуй это:
SELECT * FROM
(SELECT field1, field2 FROM fields order by field1 desc)
where rownum <= 5
Также взгляните на этот ресурс для более подробного описания того, как работает rownum.
Oracle 9i + предоставляет аналитические функции:
Все требуют использования предложения OVER
, которое позволяет PARTITION BY
и ORDER BY
правилам правильно настроить возвращаемое значение ROW_NUMBER
/RANK
/DENSE_RANK
.
До 9i единственным вариантом было работать с ROWNUM
- это, кстати, быстрее, чем использование ROW_NUMBER
(ссылка).
В Oracle 12c этого можно добиться, используя FETCH..FIRST
ROWS..ONLY
Чтобы получить топ 5 самых высоких зарплат.
SELECT *
FROM EMPLOYEES
ORDER BY SALARY DESC
FETCH FIRST 5 ROWS ONLY;
Select emp_id , salary from employees
Order by salary desc
Limit 5;