我需要让 他们部门中薪水最低的员工 我使用反加入来做到这一点。
select emp.employee_id,emp.last_name,emp.salary,emp.department_id
from employees emp
left join employees sml
on sml.department_id = emp.department_id and sml.salary < emp.salary
where sml.employee_id is null and emp.department_id is not null
但是有人告诉我,可以 使用一个 select 使用窗口功能来做到这一点。但是我不能按 department_id 对它进行分组并同时使用它。这是一个错误还是我很愚蠢?
SELECT department_id,
min(salary) OVER (partition by department_id) as minsalary
FROM employees;
GROUP BY department_id
SQL Developer 说 00979. 00000 - “不是 GROUP BY 表达式”
原文由 E.Saraf 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您在没有
group by
的情况下运行第二个查询 - 您可能已经尝试过,从您发布的额外分号中 - 您会看到每个员工都有一行,每个员工都显示最低工资在他们的部门。该最小值是分析min()
因为它有一个窗口子句。PARTITION BY
相当于GROUP BY
,但没有对整个结果集进行聚合。获得相同结果(几乎)的最简单方法是使用
RANK()
分析函数,它根据您提供的分区和顺序对值进行排名,同时允许平局:对于部门 20 和 30,您可以看到排名 1 的行是最低工资。对于 90 部门,有两名员工排名 1,因为他们的最低工资相同。
您可以将其用作内联视图并仅选择排名第一的那些行:
如果您不必担心关系,还有一个更简单的选择,但在这里不合适。
请注意,这为您提供了比原始查询多一行的信息。您正在加入
on sml.department_id = emp.department_id
。如果部门 ID 为空(如员工 178 的情况),则该联接将失败,因为您无法使用相等测试将空值与空值进行比较。因为此解决方案没有联接,所以不适用,您会在结果中看到该员工。