#SQL #ЗАПРОС #СТРОКАЧИСЛО #ORACLE

Я хотел бы выбрать 3-ю зарплату из сотрудников TABLE. Я написал QUERY, как вы можете видеть ниже, но, к сожалению, он дает мне 0 записей. Может ли кто-нибудь помочь мне по этой теме? Я использую СУБД Oracle :) и вот пример моей базы данных: SQL Fiddle

SELECT *
FROM 
  (SELECT ROWNUM, salary 
  FROM 
    (SELECT DISTINCT salary 
    FROM employees
    ORDER BY salary desc)
  )
WHERE ROWNUM = 3;

person Bro    schedule 09.01.2019    source источник
comment
Не возражаете ли вы предоставить пример ввода и ожидаемый результат как formatted text?   -  person Tony    schedule 09.01.2019
comment
поскольку мы понятия не имеем, какова структура вашей таблицы, что содержат ваши исходные данные или какой результат вы ожидали получить, очень сложно сказать вам, верен ли ваш запрос или что нужно изменить. Мы не можем волшебным образом заглянуть в вашу базу данных... вам нужно предоставить нам полную информацию о вашем сценарии - спасибо.   -  person ADyson    schedule 09.01.2019
comment
Какую СУБД вы используете? Постановка такого вопроса слишком широка, поскольку каждая СУБД считает строки по-разному. SQL Server даже не имеет детерминированного количества строк без понятия порядка.   -  person OzrenTkalcecKrznaric    schedule 09.01.2019
comment
Также, пожалуйста, отметьте, какую СУБД вы используете конкретно - например. Oracle, MySQL, SQL Server и т. д. Синтаксис, необходимый для запроса, или доступные вам функции могут различаться в зависимости от этого.   -  person ADyson    schedule 09.01.2019
comment
SELECT ROWNUM также из вашего внутреннего запроса   -  person Piyush aggarwal    schedule 09.01.2019
comment
Я использую СУБД Oracle :) и вот пример моей базы данных: sqlfiddle.com/ #!4/7ee358/4   -  person Bro    schedule 09.01.2019
comment
хорошо, поэтому, пожалуйста, отредактируйте свой вопрос, чтобы пометить его оракулом, а также включить некоторые дополнительные сведения о базе данных и ссылку на скрипку внутри вопроса - записи в комментариях предназначены для предложений / кратких дискуссий, а не для информации, непосредственно относящейся к вопросам. Спасибо. (Нажмите кнопку редактирования сразу под синими тегами sql и rownum, чтобы начать изменение вопроса.)   -  person ADyson    schedule 09.01.2019


Ответы (2)


В стандартном SQL, большинстве баз данных и Oracle 12C+ вместо этого вы можете использовать:

SELECT DISTINCT salary 
FROM employees
ORDER BY salary desc
OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY;
person Gordon Linoff    schedule 09.01.2019

Кажется, это Oracle (ROWNUM и нет псевдонима для производной таблицы). ROWNUM вычисляется для результирующих строк, поэтому вы никогда не сможете отфильтровать значение ROWNUM больше 1.

Вам нужен стандартный SQL ROW_NUMBER:

SELECT *
FROM
 ( SELECT salary
      ,row_number() over (ORDER BY salary desc) as rn 
   FROM employees
   GROUP BY salary
 ) dt
WHERE rn = 3;

GROUP BY эквивалентен DISTINCT, но обрабатывается до ROW_NUMBER, а DISTINCT обрабатывается после.

Редактировать:

Если вы хотите использовать ROWNUM, вы должны дать ему псевдоним:

SELECT *
FROM 
  (SELECT ROWNUM as rn, salary 
  FROM 
    (SELECT DISTINCT salary 
    FROM employees
    ORDER BY salary desc)
  )
WHERE rn = 3;
person dnoeth    schedule 09.01.2019
comment
Спасибо за помощь,. Теперь все понятно. :) - person Bro; 09.01.2019