如果您在沒有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,而不是兩個。 –