如果您在没有group by
的情况下运行第二个查询(您可能已经尝试过),则可以从您发布的额外分号中运行第一个查询 - 您会看到每个员工都会得到一行,每个员工显示他们的最低工资部。该最小值是分析min()
,因为它有一个窗口子句。 PARTITION BY
相当于GROUP BY
,但没有整个结果集合。
得到相同的结果,最简单的方式(几乎)是使用RANK()
解析函数来代替,该排名根据您提供的分区和秩序价值,同时允许的关系:
SELECT employee_id, last_name, salary, department_id,
RANK() OVER (PARTITION BY department_id ORDER BY salary) AS rnk
FROM employees
ORDER BY department_id, rnk;
EMPLOYEE_ID LAST_NAME SALARY DEPARTMENT_ID RNK
----------- ------------------------- ---------- ------------- ----------
200 Whalen 4400 10 1
202 Fay 6000 20 1
201 Hartstein 13000 20 2
119 Colmenares 2500 30 1
118 Himuro 2600 30 2
117 Tobias 2800 30 3
116 Baida 2900 30 4
115 Khoo 3100 30 5
114 Raphaely 11000 30 6
...
102 De Haan 17000 90 1
101 Kochhar 17000 90 1
100 King 24000 90 3
...
对于部门20和30你可以看到第1排是最低的薪水。对于90部门,有两名员工排名第一,因为他们的薪水最低。
您可以使用它作为内嵌视图,并选择只是那些行排名第1:
SELECT employee_id, last_name, salary, department_id
FROM (
SELECT employee_id, last_name, salary, department_id,
RANK() OVER (PARTITION BY department_id ORDER BY salary) AS rnk
FROM employees
)
WHERE rnk = 1
ORDER BY department_id;
EMPLOYEE_ID LAST_NAME SALARY DEPARTMENT_ID
----------- ------------------------- ---------- -------------
200 Whalen 4400 10
202 Fay 6000 20
119 Colmenares 2500 30
203 Mavris 6500 40
132 Olson 2100 50
107 Lorentz 4200 60
204 Baer 10000 70
173 Kumar 6100 80
101 Kochhar 17000 90
102 De Haan 17000 90
113 Popp 6900 100
206 Gietz 8300 110
178 Grant 7000
13 rows selected.
如果您没有担心的关系有一个更简单的选择,但它ins't适合在这里。
请注意,这会给您比原始查询多一行。您正在加入on sml.department_id = emp.department_id
。如果部门标识为null(与员工178相同),则该连接失败,因为您无法将null与具有相等性测试的空值进行比较。由于此解决方案没有加入,所以不适用,并且您在结果中看到该员工。
它工作正常,谢谢。但告诉我,有没有更简单的方法?对我来说似乎有点长。我认为可能有其他方式来分组,更令人愉快和明显。 –
@ E.Saraf - [FIRST](https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions065.htm#SQLRF00641)是一种替代方案,但每个部门只能获得一行 - 如此对于部门90你只能得到101或102,而不是两个。 –