Использование функции MIN в предложении have

Я хочу получить имя сотрудника, у которого минимальная зарплата. Есть ли способ сделать это, используя только один запрос? Я дал свой запрос ниже, он не работает, потому что условие наличия требует условия. Есть ли способ указать условие в предложении наличия, которое вернет имя сотрудника с минимальной заработной платой?

SELECT first_name,min(salary) as "sal"
FROM Employees
GROUP BY first_name 
having min(salary);

person Sindu_    schedule 04.11.2013    source источник


Ответы (7)


Как насчет использования ROWNUM?

SELECT *
FROM(SELECT first_name, salary
     FROM Employees
     ORDER BY salary
) WHERE ROWNUM = 1
person MarcinJuraszek    schedule 04.11.2013
comment
Большое спасибо. Но я пытался сделать это в одном запросе - person Sindu_; 04.11.2013
comment
Sindu_, сколько запросов ты видишь? Это всего лишь один запрос. - person Jeffrey Kemp; 04.11.2013
comment
@JeffreyKemp Я пытаюсь сделать это без использования подзапроса - person Sindu_; 04.11.2013
comment
Какая у вас проблема с подзапросами? Это одна из самых мощных функций SQL. - person Jeffrey Kemp; 04.11.2013
comment
@JeffreyKemp У меня нет с этим проблем. Я просто хотел знать, возможно ли это сделать без использования подзапроса. - person Sindu_; 04.11.2013
comment
Ответ на этот вопрос будет зависеть от того, какую версию Oracle вы используете. Oracle 12c поддерживает запросы TOP-N: oracle-base.com/articles/12c/ - person Jeffrey Kemp; 04.11.2013
comment
упростил подзапрос - person Jeffrey Kemp; 04.11.2013

Попробуйте это решение, вдохновленное здесь:

SELECT e1.first_name, e1.salary AS "sal"
FROM Employees e1
LEFT OUTER JOIN Employees e2
ON (e1.id <> e2.id AND e1.salary > e2.salary)
WHERE e2.id IS NULL;
person evalarezo    schedule 14.11.2013

С помощью одного оператора SELECT:

SELECT MIN( first_name ) KEEP ( DENSE_RANK FIRST ORDER BY salary ASC, first_name ASC ) AS first_name,
       MIN( salary     ) KEEP ( DENSE_RANK FIRST ORDER BY salary ASC, first_name ASC ) AS salary
FROM   Employees;

SQLFIDDLE

Однако, если есть несколько человек с одинаковой минимальной зарплатой, то это получит только тот, имя которого стоит первым в алфавитном порядке.

Вы можете получить все имена, но для этого потребуется несколько операторов SELECT:

SELECT first_name, salary
FROM   Employees
WHERE  salary = ( SELECT MIN(salary) FROM Employees ); 

Но наличие нескольких операторов SELECT — это неплохо.

SQLFIDDLE

person MT0    schedule 14.11.2013

Если вам нужен сотрудник с самой низкой зарплатой, почему бы вам не использовать Order By ..

SELECT top 1 first_name,min(salary) as LowestSalary
FROM Employees order by Salary asc
person MusicLovingIndianGirl    schedule 04.11.2013
comment
Спасибо, но я попробовал ваш запрос в SQL Developer. Это дает эту ошибку: 00923. 00000 - ключевое слово FROM не найдено там, где ожидалось - person Sindu_; 04.11.2013
comment
Это неправильно; OP использует Oracle, а TOP недопустимый синтаксис. - person Ben; 04.11.2013

ВЫБЕРИТЕ first_name,min(salary) as "sal" FROM Employees GROUP BY first_name имея min(salary) >0;

person user63814    schedule 26.06.2019

person    schedule
comment
Спасибо. Но я пытался найти способ сделать это в одном запросе. - person Sindu_; 04.11.2013

person    schedule
comment
Это неправильно; OP использует Oracle, а TOP недопустимый синтаксис. - person Ben; 04.11.2013