【问题标题】:Finding the highest average salary of a department using joins in SQL?使用 SQL 中的连接查找部门的最高平均工资?
【发布时间】:2026-01-11 16:25:01
【问题描述】:

我有两个具有以下架构的表:

Table 1
-------
empID
empName


Table 2
-------
empID 
department  
salary

假设表格是: 表1:

empID|empName
1    A
2    B
3    C
4    D
5    E
6    F
7    G
8    H
9    I
10   J

表 2:

empID|department|salary
1    X    10
2    X    10
3    X    10
4    Y    5
5    Y    5
6    Y    5
7    Y    5
8    Y    5
9    Z    3
10   Z    3

我需要找到平均工资最高的部门名称,并将其与员工姓名一起显示。

我期望的输出是:

empName|department|salary
A         10        
B    X    10
C         10

这是一个面试问题,我正在根据记忆重新创建它,因此它可能并不完美。经过 2 年多的时间间隔后,我也在学习 SQL。如果我遗漏了什么,请提出建议。

我形成的查询是:

SELECT
    table1.empName,
    TOP(1) AVG(table2.salary),
    table2.department
FROM
    table1
INNER JOIN
    table2
    ON table1.empID = table2.empID
GROUP BY
    table2.department

【问题讨论】:

  • 你尝试了什么?
  • 请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • @JuanCarlosOropeza 你理解我的问题有困难吗?
  • @TarunGupta - Juan 正在为您提供资源,因为您的问题现在质量很低。如果您需要帮助,您需要使您的问题清晰易懂。
  • @Nicarus 我明白了。我是新手,我的问题质量会随着时间的推移而提高。虽然如果我在你的位置,只要我能理解别人在问什么,我会尽力帮助他们。如果我不明白某些事情,我会要求澄清。也许我的问题没有按照您的标准提出。但是我的问题难以理解吗?

标签: sql


【解决方案1】:

您的语法看起来像 SQL Server(“TOP 1”)。在那个数据库中,我会做这样的事情:

SELECT TOP (1) WITH TIES t1.empName, t2.salary, t2.department
FROM table1 t1 INNER JOIN
     table2 t2
     ON t1.empID = t2.empID
ORDER BY AVG(t2.salary) OVER (PARTITION BY t2.department) DESC;

更通用的解决方案:

SELECT empName, salary, department
FROM (SELECT t.*,
             DENSE_RANK() OVER (ORDER BY avg_salary) as seqnum
      FROM (SELECT t1.empName, t2.salary, t2.department,
                   AVG(t2.salary) OVER (PARTITION BY t2.department) as avg_salary
            FROM table1 t1 INNER JOIN
                 table2 t2
                 ON t1.empID = t2.empID
           ) t
     ) t
WHERE seqnum = 1;

【讨论】:

    【解决方案2】:

    根据我从您的问题中得出的结论,我会这样处理。

    WITH department_rank AS
    (
    SELECT
        department,
        RANK() OVER(ORDER BY avg_salary DESC) AS avg_salary_rank
    FROM
        (
        SELECT
            department,
            AVG(salary) AS avg_salary
        FROM
            table2
        GROUP BY
            department
        ) tbl
    )
    
    SELECT
        dept.department,
        emp.empID,
        emp.empName,
        dept.salary
    FROM
        table2 dept
    JOIN
        table1 emp
        ON  (emp.empID = dept.empID)
    JOIN
        department_rank drnk
        ON  (drnk.department = dept.department)
        AND (drnk.avg_salary_rank = 1) --Top ranked department based on average salary
    

    输出:

    【讨论】:

    • 感谢您的回答。在 SQL 中创建函数对我来说是全新的。我了解您的代码背后的逻辑。我已经编辑了我的 OP 并添加了更多细节。我认为这个问题可以只用一个查询来完成。请检查已编辑的帖子。
    • 我没有按照您的要求进行操作。我添加了输出的屏幕截图 - 它为您提供了您正在寻找的结果。你能澄清一下吗?
    • 是的,你得到的输出就是我想要的。