这是一种方法,但我希望如果这是为了测试,他们不会相信你写的:-
SELECT id, name, dep_id, salary
FROM
(
SELECT id, name, dep_id, salary, @DepCnt := IF(@Dep=dep_id, @DepCnt + 1, 1) AS DepartmentCounter, @Dep:=dep_id
FROM
(
SELECT id, name, dep_id, salary
FROM emp
ORDER BY dep_id, salary DESC
) a
CROSS JOIN (SELECT @DepCnt:=1, @Dep:=0) Sub1
) Sub2
WHERE DepartmentCounter <= 2
内部选择按部门顺序获取所有行,然后在其中递减薪水。
然后下一个外部选择为每一行添加一个计数器,从 1 开始,每个部门工资最高的行。
然后外部选择只获取计数器为 1 或 2 的那些。
它的 SQLfiddle 示例:-
http://sqlfiddle.com/#!2/3643e/1
编辑 - 如果超过 1 人的薪水相同,这是前 2 名薪水之一,则扩展为带回详细信息:-
SELECT id, name, dep_id, salary
FROM
(
SELECT id, name, dep_id, salary, @DepCnt := IF(@Dep=dep_id, IF(@PrevSalary=salary, @DepCnt, @DepCnt + 1), 1) AS DepartmentCounter, @Dep:=dep_id, @PrevSalary:=salary
FROM
(
SELECT id, name, dep_id, salary
FROM emp
ORDER BY dep_id, salary DESC
) a
CROSS JOIN (SELECT @DepCnt:=1, @Dep:=0, @PrevSalary:=0) Sub1
) Sub2
WHERE DepartmentCounter <= 2