【发布时间】:2018-05-17 02:56:10
【问题描述】:
让我们有 2 个标准表员工和部门
CREATE TABLE departments (
id SERIAL PRIMARY KEY,
name VARCHAR
);
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
department_id INTEGER,
name VARCHAR,
salary NUMERIC(13,2)
);
查找员工总工资最高的部门名称的最佳方法是什么。
我找到了两个解决方案,但对于这样简单的任务来说,它们看起来太复杂了。
使用 rank()
SELECT name FROM (
SELECT name, rank() OVER ( ORDER BY salary DESC ) AS rank
FROM (
SELECT
departments.name,
sum(salary) AS salary
FROM employees
JOIN departments ON department_id = departments.id
GROUP BY departments.name
) AS t1
) AS t2
WHERE rank = 1;
使用子查询
WITH t1 AS (SELECT
departments.name,
sum(salary) AS salary
FROM employees
JOIN departments ON departments.id = employees.department_id
GROUP BY departments.name
)
SELECT name FROM t1
WHERE t1.salary = (SELECT max(salary) FROM t1);
乍一看,使用排名应该不太有效,因为它执行不必要的排序。尽管EXPLAIN 表明第一个选项更有效。
或者也许有人提出了另一种解决方案。
那么,使用 postgres 找到总工资最高的部门的最佳方法是什么?
【问题讨论】:
-
查看生成的执行计划
explain (analyze, buffers)
标签: sql postgresql aggregate-functions