前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开窗函数-优雅的计算每个雇员所在部门薪资最高的员工姓名

开窗函数-优雅的计算每个雇员所在部门薪资最高的员工姓名

作者头像
数据仓库晨曦
发布于 2025-04-11 08:21:19
发布于 2025-04-11 08:21:19
6700
代码可运行
举报
文章被收录于专栏:数据仓库技术数据仓库技术
运行总次数:0
代码可运行

题目

有雇员表t_employees,包含员工姓名、部门、薪资和年龄,请计算出每个员工所在部门薪资最高的员工

样例数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------+--------------+---------+------+
|  name  |     dept     | salary  | age  |
+--------+--------------+---------+------+
| Lisa   | Sales        | 10000   | 35   |
| Evan   | Sales        | 32000   | 38   |
| Fred   | Engineering  | 21000   | 28   |
| Alex   | Sales        | 30000   | 33   |
| Tom    | Engineering  | 23000   | 33   |
| Jane   | Marketing    | 29000   | 28   |
| Helen  | Marketing    | 29000   | 40   |
| Jeff   | Marketing    | 35000   | 38   |
| Paul   | Engineering  | 29000   | 23   |
| Chloe  | Engineering  | 23000   | 25   |
+--------+--------------+---------+------+

期望结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------+--------------+---------+------+----------------------+
|  name  |     dept     | salary  | age  | dept_maxsalary_name  |
+--------+--------------+---------+------+----------------------+
| Chloe  | Engineering  | 23000   | 25   | Paul                 |
| Paul   | Engineering  | 29000   | 23   | Paul                 |
| Tom    | Engineering  | 23000   | 33   | Paul                 |
| Fred   | Engineering  | 21000   | 28   | Paul                 |
| Jeff   | Marketing    | 35000   | 38   | Jeff                 |
| Helen  | Marketing    | 29000   | 40   | Jeff                 |
| Jane   | Marketing    | 29000   | 28   | Jeff                 |
| Alex   | Sales        | 30000   | 33   | Evan                 |
| Evan   | Sales        | 32000   | 38   | Evan                 |
| Lisa   | Sales        | 10000   | 35   | Evan                 |
+--------+--------------+---------+------+----------------------+

解法一

使用排序函数取出薪资最高纪录,然后筛选姓名,通过部门与原始雇员表进行关联计算出最终结果

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select t1.name,
       t1.dept,
       t1.salary,
       t1.age,
       t2.name as dept_maxsalary_name
from t_employees t1
         join
     (
     --优先计算出每个部门薪水最高的员工姓名
     select name,
             dept,
             salary,
             age
      from (select name,
                   dept,
                   salary,
                   age,
                   row_number() over (partition by dept order by salary desc) as rn
            from t_employees) t
      where t.rn = 1) t2
     on t1.dept = t2.dept

解法二

直接使用max_by函数开窗,取出结果。

max_by(x, y) - 返回与 y 的最大值相关联的 x 值。(https://sparkfunctions.com/max_by)

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,
       dept,
       salary,
       age,
       max_by(name,salary) over (partition by dept) as dept_maxsalary_name
from t_employees

为了方便查看对比,我们增加一列雇员所在部门薪资最高同事的薪资(与max函数进行对比) 执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,
       dept,
       salary,
       age,
       max(salary)over (partition by dept) as dept_maxsalary,
       max_by(name,salary) over (partition by dept) as dept_maxsalary_name
from t_employees

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------+--------------+---------+------+-----------------+----------------------+
|  name  |     dept     | salary  | age  | dept_maxsalary  | dept_maxsalary_name  |
+--------+--------------+---------+------+-----------------+----------------------+
| Fred   | Engineering  | 21000   | 28   | 29000           | Paul                 |
| Tom    | Engineering  | 23000   | 33   | 29000           | Paul                 |
| Paul   | Engineering  | 29000   | 23   | 29000           | Paul                 |
| Chloe  | Engineering  | 23000   | 25   | 29000           | Paul                 |
| Jane   | Marketing    | 29000   | 28   | 35000           | Jeff                 |
| Helen  | Marketing    | 29000   | 40   | 35000           | Jeff                 |
| Jeff   | Marketing    | 35000   | 38   | 35000           | Jeff                 |
| Lisa   | Sales        | 10000   | 35   | 32000           | Evan                 |
| Evan   | Sales        | 32000   | 38   | 32000           | Evan                 |
| Alex   | Sales        | 30000   | 33   | 32000           | Evan                 |
+--------+--------------+---------+------+----
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 解法一
  • 解法二
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档