mysql使用group by选择多个结果

时间:2014-09-29 06:23:41

标签: mysql greatest-n-per-group

表'员工'

id integer, 
name string, 
office integer, 
income decimal

如何在一个查询中为每个办公室选择3个最佳收入(如果可能)?

SELECT id,name 
FROM employees 
GROUP BY office 
ORDER BY income DESC 

只返回一个人/办公室

3 个答案:

答案 0 :(得分:1)

要获得每个办公室3个最高收入,你可以使用等级查询和用户定义的变量,不幸的是在其他RDBMS中通过使用Mysql的窗口函数更容易实现这种结果。不具备这些功能,以下查询将为您提供每个办公室收入最高的3名员工

SELECT t.id,t.name
FROM (
SELECT *,
@r:= CASE WHEN @g = office THEN @r + 1 ELSE 1 END row_num,
@g:= office
FROM employees 
CROSS JOIN(SELECT @g:=NULL,@r:=0) a
ORDER BY office,income DESC 
) t 
WHERE t.row_num <=3

答案 1 :(得分:1)

我会给你一个方法来做到这一点,但通过一点点解决方法,你得到你想要的东西,检查这个SQLFiddle是否有测试的查询。

select * from employees as e1 having 4>=(select count(*) from employees as e2 where e1.income<e2.income);

答案 2 :(得分:0)

选择每个办事处的最高收入:

SELECT office, max(income)
FROM employees 
GROUP BY office

让员工获得这些收入:

SELECT e.id, e.name, e.office
FROM employees as e
INNER JOIN (SELECT office, max(income) as income FROM employees GROUP BY office) as mx ON e.office = mx.office and e.income = mx.income

修改

我复制了Ajeesh的SQLFiddle以测试查询:http://sqlfiddle.com/#!2/de4de1/14/0