**Department table name** **following with fields name** id , empid ,salary ,departid ,status
如何通过mysql中的单个查询获得每个部门的前两名最高工资
答案 0 :(得分:10)
SELECT emp1.departid , emp1.salary
FROM Department emp1
WHERE (
SELECT COUNT(DISTINCT(emp2.salary))
FROM Department emp2
WHERE emp2.salary > emp1.salary and emp1.departid = emp2.departid ) in (0,1) group by emp1.departid , emp1.salary
我在sql server中测试了这个解决方案。但我认为它也适用于ms sql。
答案 1 :(得分:9)
尝试
SELECT id, empid, salary, departid, status
FROM
(
SELECT id, empid, salary, departid, status,
@n := IF(@g = departid, @n + 1, 1) rownum,
@g := departid
FROM table1
ORDER BY departid, salary DESC
) q
WHERE q.rownum <= 2
这是 SQLFiddle 演示
它在内部生成的内容根据工资为每个部门中的每个员工选择一个等级。然后在外部选择它过滤掉排名超过2(前两个)的所有行。
答案 2 :(得分:1)
我相信这就是你想要的。请注意,此查询未经过测试,因为我无法访问MySQL db atm。
SELECT
d1.id,
d1.salary,
d1.departid
FROM department d
WHERE
d1.id IN
(
SELECT
d2.id
FROM department d2
WHERE
d2.departid = d1.departid
ORDER BY salary DESC
LIMIT 2
)
这可能不是最有效的查询,但它可以完成这项任务。