找到总工资最高的部门的最佳方法 Postgresql
Posted
技术标签:
【中文标题】找到总工资最高的部门的最佳方法 Postgresql【英文标题】:The best way to find the Department with the maximum total salary Postgresql 【发布时间】: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)
【参考方案1】:
我会将rank()
写成:
SELECT *
FROM (SELECT d.name, SUM(e.salary) AS salary,
RANK() OVER (ORDER BY SUM(e.salary)) as rnk
FROM employees e JOIn
departments d
ON e.department_id = d.id
GROUP BY d.name
) d
WHERE rnk = 1;
(额外的子查询不应该影响性能,但它也没有添加任何内容来澄清查询。)
因为窗口函数是数据库内置的,所以数据库有一些方法可以提高它们的效率。获取MAX()
也有开销。但是,老实说,我希望这两种方法具有相似的性能。
我应该注意,如果您只希望返回一个部门——即使有关系——那么最简单的方法是:
SELECT d.name, SUM(e.salary) AS salary
FROM employees e JOIn
departments d
ON e.department_id = d.id
GROUP BY d.name
ORDER BY SUM(e.salary) DESC
FETCH FIRST 1 ROW ONLY
【讨论】:
以上是关于找到总工资最高的部门的最佳方法 Postgresql的主要内容,如果未能解决你的问题,请参考以下文章