擷取所有分組中某列最大的行,擷取分組列最大
怎麼擷取所有分組中某列最大的行?下面用一個例子來說明下:
一共公司有若干員工,每個員工有各自的id, group_id(部門), salary(工資).現在的問題轉變為
求公司各部門最高工資的員工
首先明確一個問題,一個部門的若干個員工可能同時擁有最高的工資,需要都列舉出來。
看一下員工的資料庫表結構(只包含有用的列):
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int(11) |
NO |
PRI |
NULL |
|
group_id |
int(11) |
YES |
|
NULL |
|
salary |
int(11) |
YES |
|
NULL |
|
添加的測試資料如下:
id |
group_id |
salary |
1 |
1 |
100 |
2 |
1 |
200 |
3 |
1 |
200 |
4 |
2 |
200 |
5 |
2 |
300 |
我們需要做的步驟如下:
-
- 擷取各個部門最高的工資
-
- 尋找各個部門工資等於最高工資的員工
擷取各個部門最高的工資
select group_id, max(salary) as max_salary from employee group by group_id ;
執行後的結果:
group_id |
max_salary |
1 |
200 |
2 |
300 |
尋找各個部門工資等於最高工資的員工
select a.id, a.group_id, a.salary from employee as a, b where a.group_id=b.group_id and a.salary=b.max_salary ;
假設第一執行後的資料存在表b中。
這樣就得到了最終的結果:
id |
group_id |
salary |
2 |
1 |
200 |
3 |
1 |
200 |
5 |
2 |
300 |
我們可以簡單的將擷取各個部門最高的工資的代碼替換b即可,組合後的語句如下:
select a.id, a.group_id, a.salary from employee as a, (select group_id, max(salary) as max_salary from employee group by group_id) as b where a.group_id=b.group_id and a.salary=b.max_salary ;
執行後的結果相同。
總結
我們首先按照部門進行分組,擷取每組最大的工資(表b); 之後將表a(原表)與表b做一下笛卡爾積,篩選出我們需要的資料即可。
更多文章請訪問小胖軒
.
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。