Oracle SQL - Как получить 5 самых высоких значений столбца - PullRequest
16 голосов
/ 21 февраля 2010

Как написать запрос, в котором возвращается только выбранное количество строк с максимальным или минимальным значением столбца.

т.е. Отчет с 5 самыми высокооплачиваемыми сотрудниками?

Ответы [ 5 ]

25 голосов
/ 21 февраля 2010

Лучший способ сделать это - использовать аналитические функции 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 () или одну из функций ранжирования.

11 голосов
/ 21 февраля 2010

Попробуйте это:

SELECT * FROM 
    (SELECT field1, field2 FROM fields order by field1 desc) 
where rownum <= 5

Также посмотрите на этот ресурс для более подробного описания того, как работает rownum.

4 голосов
/ 21 февраля 2010

Oracle 9i + предоставляет аналитические функции:

Все требуют использования предложения OVER, что позволяет предложениям PARTITION BY и ORDER BY правильно настроить возвращаемое значение ROW_NUMBER / RANK / DENSE_RANK.

До 9i единственным вариантом была работа с ROWNUM - что, кстати, быстрее, чем при использовании ROW_NUMBER ( link ).

1 голос
/ 06 февраля 2018

В Oracle 12c , это может быть достигнуто с помощью FETCH..FIRST ROWS..ONLY

Чтобы получить 5 самых высоких зарплат.

 SELECT *
       FROM EMPLOYEES
   ORDER BY SALARY DESC
FETCH FIRST 5 ROWS ONLY;
0 голосов
/ 25 сентября 2018
Select emp_id , salary from employees
  Order by salary desc
  Limit 5;
...