SQL练习题之求每个部门工资最高的人

冬至,又称日南至、冬节、亚岁。
——本文写于2022年冬至前夕


前言

分享自己做SQL练习时遇到的经典题目——求组内极值,供各位小伙伴参考。


一、题目

现有员工表employee,求每个部门工资最高的前五个员工的 id, name, dept, salary 四项信息。

二、表数据

建表语句如下,建表并插入测试数据。

create table employee
(
    id     serial primary key,
    name   text,
    dept   text,
    salary decimal(10,2)
);

insert into employee values
(1,'张三','财务部',10000),
(2,'李四','财务部',8000),
(3,'王五','市场部',12000),
(4,'陈六','市场部',15000),
(5,'罗七','市场部',7000),
(6,'周八','人事部',7000),
(7,'gogo','财务部',9000),
(8,'vovo','财务部',7000),
(9,'coco','市场部',12000),
(10,'jojo','市场部',13000),
(11,'toto','市场部',10000),
(12,'dodo','市场部',8000),
(13,'koko','财务部',6000);

在这里插入图片描述

三、解答方法

(一)具体步骤

  1. 利用开窗函数,根据部门分组;
  2. 按工资降序排列,取前五数据。
select
    id, 
    name, 
    dept, 
    salary
from 
(
    select 
        id, 
        name, 
        dept, 
        salary, 
        rank() over (partition by dept order by salary desc) as r
    from employee
) t
where r <= 5;

(二)结果截图

在这里插入图片描述

四、延伸思考

总结本题思路并结合本人之前的博客《笔试题之编写SQL按要求查询用户阅读行为数据》第三题和《笔试题之多维度求极值》,发现此类题目有共通之处,可以使用同一类思路解答,具体逻辑思路如下。

1. 利用开窗函数,先按某个维度分组;
2. 再按度量排序;
3. 最后根据需要取某些排序位置的数据。

适用于求多维度下某个度量的极值或部分数据。通用代码思路如下。

-- 通用代码思路
select
    id, 
    aa, 
    bb, 
    cc
from 
(
    select 
        id, 
        aa, 
        bb, 
        cc, 
        rank() over (partition by bb order by cc desc) as r
    from XX
) t
where r <= y;

-- 《笔试题之多维度求极值》使用该思路的解法
select
    t1.name,
    t1.subject,
    t1.subject_score
from
(
    select 
        name,
        subject,
        subject_score,
        row_number() over(partition by subject order by subject_score desc) r
    from score
) t1
where r = 1
;

题外话

冬至是二十四节气中一个重要的节气,也是中国民间的传统祭祖节日。冬至是四时八节之一,被视为冬季的大节日,在古代民间有“冬至大如年”的讲法。冬至习俗因地域不同而又存在着习俗内容或细节上的差异。在中国南方地区,有冬至祭祖、宴饮的习俗。在中国北方地区,每年冬至日有吃饺子的习俗。
在老家潮州,小时候冬至(老家叫冬节)会一家人自己搓丸子煮成甜汤吃,有点类似元宵,也会祭祖(老家叫过冬纸)。明天就是冬至了,提前祝各位小伙伴身体健康,工作顺利,远离新冠。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张六十zhangliushi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值