Oracle SQL Поиск 5 самых низких зарплат

Я пытаюсь ответить на следующий вопрос. Показать ID_Number и имя для пяти самых низкооплачиваемых сотрудников.

Это таблица с сотрудниками:

CREATE TABLE Employees
    (ID_No          CHAR(4)     NOT NULL,
     Name           VARCHAR(50) NOT NULL,
     Hire_Date      DATE        NOT NULL,
     Position       VARCHAR(20) CHECK(Position IN('CHAIRMAN','MANAGER','ANALYST','DESIGNER','PROGRAMMER','SALES REP','ADMIN','ACCOUNTANT')),
     Salary         NUMERIC(8,2)    NOT NULL,
     Mgr_ID_No      CHAR(4)     NULL,
     Dept_No        SMALLINT    NULL);

Добавлю, что пробовал несколько способов и "лимит" и "верх" почему-то не работают.


person Alexandru Petrea    schedule 24.05.2018    source источник
comment
не могли бы вы включить свою попытку?   -  person Tolu    schedule 25.05.2018


Ответы (3)


В Oracle 12c:

-- more than 5 rows being returned, if multiple rows 
-- match the value of the 5th row
SELECT e.ID_No, e.Name
  FROM Employees e
 ORDER BY e.Salary  
 FETCH FIRST 5 ROWS WITH TIES;

-- only 5 rows being returned, even if multiple rows 
-- match the value of the 5th row
SELECT e.ID_No, e.Name
  FROM Employees e
 ORDER BY e.Salary  
 FETCH FIRST 5 ROWS ONLY; 

-- NEXT clause may be replaced with FIRST  
SELECT e.ID_No, e.Name
  FROM Employees e
 ORDER BY e.Salary 
 FETCH NEXT 5 ROWS ONLY; 

До Oracle 12c:

SELECT e.ID_No, e.Name
  FROM ( SELECT ID_No, Name, row_number() over (order by salary) seq FROM Employees ) e
 WHERE e.seq <= 5
 ORDER BY e.seq; 

запросы могут использоваться для Топ-N запросов

person Barbaros Özhan    schedule 25.05.2018

Здесь должна работать оконная функция row_number() (обратите внимание, что оконные функции нельзя использовать в предложениях WHERE/HAVING).

SELECT ID_No, Name
FROM (SELECT ID_No, Name, Row_Number() OVER (ORDER BY Salary) RN
  FROM Employees)
WHERE RN <= 5;
person Sheng    schedule 24.05.2018

В Oracle можно использовать ROWNUM.

SELECT *
       FROM (SELECT ID_No,
                    Name
                    FROM Employees
                    ORDER BY Salary) x
       WHERE ROWNUM <= 5;

Другим методом может быть подзапрос, подсчитывающий строки с меньшей или равной зарплатой.

SELECT EO.ID_No,
       EO.Name
       FROM Employees EO
       WHERE (SELECT COUNT(*)
                     FROM Emplyoees EI
                     WHERE EI.Salary <= EO.Salary) <= 5;
person sticky bit    schedule 24.05.2018