我正在使用Oracle和SQL Developer。我已经下载了HR schema,需要用它来做一些查询。现在我正在使用表Employees
。作为用户,我需要看到每个部门中工资最低的员工列表。我需要通过普通SQL和一个分析函数来提供不同的解决方案。关于分析函数,我使用了RANK()
:
SELECT *
FROM
(SELECT
employee_id,
first_name,
department_id,
salary,
RANK() OVER (PARTITION BY department_id
ORDER BY salary) result
FROM
employees)
WHERE
result = 1
AND department_id IS NOT NULL;
结果似乎正确:
但当我尝试使用普通SQL时,我实际上得到了所有雇员及其薪水。
下面是我对GROUP BY
的尝试:
SELECT
department_id, MIN(salary) AS "Lowest salary"
FROM
employees
GROUP BY
department_id;
这段代码看起来不错,但我还需要获取first_name
和employee_id
列。
我试着做这样的事情:
SELECT
employee_id,
first_name,
department_id,
MIN(salary) result
FROM
employees
GROUP BY
employee_id,
first_name,
department_id;
以及以下内容:
SELECT
employee_id,
first_name,
salary,
departments.department_id
FROM
employees
LEFT OUTER JOIN
departments ON (employees.department_id = departments.department_id)
WHERE
employees.salary = (SELECT MIN(salary)
FROM departments
WHERE department_id = employees.department_id)
这些似乎是错误的。我如何改变或修改我的查询以获得与通过普通SQL使用RANK()
时相同的结果(至少有两种解决方案)?
4条答案
按热度按时间uplii1fm1#
其中一个选项可以像这里(与旧EMP表)...
第二个选择可能是...
此致
e5nszbig2#
您可以使用子查询查找每个雇员的最低薪金,并使用主查询仅显示由该子查询选择的那些雇员的信息:
这将产生与
RANK
查询完全相同的结果。我认为应用一些查询中缺少的排序是有意义的。我不知道你想如何排序,但这里有一个按雇员姓名排序的示例:
既然您要求至少提供两种解决方案,那么让我们来看看另一个选项:
正如您所看到的,这是不同的,因为子查询将应用
GROUP BY
子句,并且它可以作为自己的查询成功执行,而这对于前一个查询中使用的子查询是不可能的。然后,主查询的
JOIN
将确保再次获得所需的结果。2uluyalo3#
以下是获取部门中最低薪金的员工的一些选项:
最低工资超过(...)
使用RANK和FETCH FIRST
带IN
不存在
iqih9akk4#
如果每个部门只有一个人的最低薪金,则可以使用
KEEP
:其中,对于示例数据:
输出:
| 部门标识|员工标识|名字|最低薪金|
| - -|- -|- -|- -|
| 一个|一个|爱丽斯|千|
| 2个|三个|卡罗尔|三千|
如果您可以让多个员工具有相同的部门最低工资,则可以使用相关子查询:
对于样本数据,输出:
| 部门标识|员工标识|名字|薪金|
| - -|- -|- -|- -|
| 一个|一个|爱丽斯|千|
| 2个|三个|卡罗尔|三千|
| 2个|四个|黛布拉|三千|
这确实返回了黛布拉。
fiddle