返回每个部门工资最高的一名员工。
用于DISTINCT ON
更简单、更快速的查询,可以满足您的所有要求:
SELECT DISTINCT ON (d.id)
d.id AS department_id, d.name AS department
,e.id AS employee_id, e.name AS employee, e.salary
FROM departments d
LEFT JOIN employees e ON e.department_id = d.id
ORDER BY d.id, e.salary DESC;
->SQLfiddle(用于 Postgres)。
另请注意LEFT [OUTER] JOIN
,结果中没有员工的部门。
这只会选择one
每个部门的员工。如果有多个共享最高薪水,您可以添加更多 ORDER BY 项目以特别选择一个。否则,从同行中选择任意一个。
如果没有员工,仍会列出部门,其中NULL
包含员工列的值。
您可以简单地在列表中添加您需要的任何列SELECT
。
在此相关答案中找到该技术的详细解释、链接和基准:
选择每个 GROUP BY 组中的第一行?
旁白:使用非描述性的列名(如name
or )是一种反模式id
。应该是employee_id
等employee
返回每个部门工资最高的所有员工。
使用窗口函数rank()
(就像@Scotch 已经发布的一样,更简单、更快):
SELECT d.name AS department, e.employee, e.salary
FROM departments d
LEFT JOIN (
SELECT name AS employee, salary, department_id
,rank() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rnk
FROM employees e
) e ON e.department_id = d.department_id AND e.rnk = 1;
与您的示例(没有联系)的上述查询相同的结果,只是慢了一点。