找到总工资最高的部门的最佳方法 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的主要内容,如果未能解决你的问题,请参考以下文章

如何找到每个部门工资最高的员工? [复制]

文巾解题 184. 部门工资最高的员工

MySQL部门工资最高的员工

SQL数据库 计算出每个部门的平均工资 最高工资和最低工资 语法怎么写?

每日一题:如何计算除去最高最低工资的部门平均工资

用oracle怎样查询每个部门的部门编号,部门名称,平均工资,最高工资和最低工资