冬至,又称日南至、冬节、亚岁。
文章目录
- 前言
- 一、题目
- 二、表数据
- 三、解答方法
- 四、延伸思考
- 题外话
前言
分享自己做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);
三、解答方法
利用开窗函数,根据部门分组,再按工资降序排列,取前五数据。
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按要求查询用户阅读行为数据》第三题和《笔试题之多维度求极值》,发现此类题目有共通之处,可以使用同一类思路解答,具体逻辑思路如下。
- 利用开窗函数,先按某个维度分组;
- 再按度量排序;
- 最后根据需要取某些排序位置的数据。
适用于求多维度下某个度量的极值或部分数据。通用代码思路如下。
-- 通用代码思路
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
;
题外话
冬至是二十四节气中一个重要的节气,也是中国民间的传统祭祖节日。冬至是四时八节之一,被视为冬季的大节日,在古代民间有“冬至大如年”的讲法。冬至习俗因地域不同而又存在着习俗内容或细节上的差异。在中国南方地区,有冬至祭祖、宴饮的习俗。在中国北方地区,每年冬至日有吃饺子的习俗。
在老家潮州,小时候冬至(老家叫冬节)会一家人自己搓丸子煮成甜汤吃,有点类似元宵,也会祭祖(老家叫过冬纸)。明天就是冬至了,提前祝各位小伙伴身体健康,工作顺利,远离新冠。