Как мне упорядочить строки после использования «Fetch First» в Oracle SQL?

#sql #oracle #oracle12c #sql-fetch

#sql #Oracle #oracle12c #sql-выборка

Вопрос:

У меня есть SQL-запрос Oracle, который используется FETCH FIRST для поиска сотрудников с самой высокой годовой зарплатой в базе данных PeopleSoft.

 SELECT A.EMPLID, A.ANNUAL_RT
FROM PS_EMPLOYEES A
ORDER BY A.ANNUAL_RT DESC
FETCH FIRST ROW WITH TIES;
 
 EMPLID   ANNUAL_RT
20218    100000
10300    100000
26992    100000
17864    100000
 

Я хочу отсортировать свои результаты по EMPLID. Однако, поскольку я использую FETCH FIRST 1 ROW WITH TIES , добавление EMPLID в мое ORDER BY предложение ограничивает мои результаты до 1 сотрудника с наименьшим идентификационным номером.

 SELECT A.EMPLID, A.ANNUAL_RT
FROM PS_EMPLOYEES A
ORDER BY A.ANNUAL_RT DESC, A.EMPLID ASC
FETCH FIRST 1 ROW WITH TIES;
 
 EMPLID   ANNUAL_RT
10300    100000
 

Как я могу отсортировать свои результаты, не влияя на то, какие строки возвращаются FETCH FIRST ?

 EMPLID   ANNUAL_RT
10300    100000
17864    100000
20218    100000
26992    100000
 

Ответ №1:

Заключите свой запрос в виде табличного выражения (также подойдет обычное табличное выражение). Таким образом, вы можете обработать его после обработки.

Например:

 select *
from (
  SELECT A.EMPLID, A.ANNUAL_RT
  FROM PS_EMPLOYEES A
  ORDER BY A.ANNUAL_RT DESC
  FETCH FIRST 1 ROW WITH TIES
) x
order by emplid;
 

Ответ №2:

Вы можете использовать RANK() или DENSE_RANK() вместо FETCH FIRST .

 SELECT EMPLID, ANNUAL_RT
FROM (
  SELECT
    A.EMPLID,
    A.ANNUAL_RT,
    RANK() OVER (ORDER BY A.ANNUAL_RT DESC) AS RANK_NO
  FROM PS_EMPLOYEES A
)
WHERE RANK_NO = 1
ORDER BY EMPLID;
 

Результаты:

 EMPLID   ANNUAL_RT
10300    100000
17864    100000
20218    100000
26992    100000