面试被经常问的SQL窗口函数

news/2025/1/3 7:39:50/

图片

面试题

有一张“学生成绩表”,包含4个字段:班级id、学生id、课程id、成绩。

在这里插入图片描述

问题1: 求出每个学生成绩最高的三条记录

问题2: 找出每门课程都高于班级课程平均分的学生

技术提升

技术要学会分享、交流,不建议闭门造车。一个人走的很快、一堆人可以走的更远。

我这边梳理一套数据分析面试题宝典,此外文章中的源码、资料、数据、技术交流提升, 均可加知识星球交流群获取,群友已超过2000人,添加时切记的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:pythoner666,备注:来自 CSDN + 面试题
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

【解题步骤】

1. topN问题

问题1是常见的排名问题(topN问题),要想到用SQL的窗口函数来解决这类业务问题。

用窗口函数获取顺序有三种:rank(),dense_rank()和row_number()。

同样是按“值”从小到大排序,三者的区别如下:

在这里插入图片描述

根据问题的描述,我们应该使用dense_rank窗户函数

select *
from (
select *,dense_rank() over (partition by 班级id,学生id order by 成绩 desc) as 顺序
from 学生成绩表
) t1
where 顺序 <= 3;

查询结果:

在这里插入图片描述

2. 汇总分析

问题2要求找出每门课程都高于班级课程平均分的学生,可以拆解成以下几个问题:

1)求出每个班级,每门课程的平均分

2)将学生每门课程的成绩与所在班级的对应课程平均分相减,结果大于0就说明该学生的这门成绩高于课程平均分

3)“找出每门课程都高于班级课程平均分的学生”说明对于学生来说,最小的“相减结果”都是大于0的

首先用汇总分析求出每个班级,每门课程的平均分。

select 班级id,课程id,avg(成绩) as 课程平均分
from 学生成绩表
group by 班级id,课程id;

查询结果:

在这里插入图片描述

3. 多表联结

涉及到多表查询,需要用到多表联结。

这里目的是为了将“将学生每门课程的成绩与所在班级的对应课程平均分相减”。

所以,是将原始的“学生成绩表”与“班级的课程平均分”进行联结。

为了保持左表“学生成绩表”的所有数据,将所有学生的成绩都与“课程平均分”x相减,所以选择“左联结(left join)”。

在这里插入图片描述

select t1.班级id,t1.学生id,t1.课程id,t1.成绩,t1.成绩 - t2.课程平均分 as 相减结果
from 学生成绩表 t1
left join (
select 班级id,课程id,avg(成绩) as 课程平均分
from 学生成绩表
group by 班级id,课程id
) t2 on t1.班级id = t2.班级id and t1.课程id = t2.课程id;

在这里插入图片描述

最后使用分组汇总,并结合having条件筛选出“相减结果的最小值大于0”的学生。

select 班级id,学生id
from (
select t1.班级id,t1.学生id,t1.课程id,t1.成绩,t1.成绩 - t2.课程平均分 as 相减结果
from 学生成绩表 as t1
left join (
select 班级id,课程id,avg(成绩) as 课程平均分
from 学生成绩表
group by 班级id,课程id
) as t2 on t1.班级id = t2.班级id and t1.课程id = t2.课程id
) as tmp
group by 班级id,学生id
having min(相减结果) > 0;

在这里插入图片描述

本题考点

1.考查对分组汇总的了解,以及灵活使用来解决业务问题;

2.考查对多表联结的了解,以及灵活使用来解决业务问题;

3)考查对窗口函数的了解,窗户函数解决的经典问题就那么几种,记下来,就可以解决99%的业务问题。


http://www.ppmy.cn/news/47375.html

相关文章

书写我的人生回忆录-这应该是给父母最好的礼物

作为一个业余的软件开发爱好者&#xff0c;我又捣鼓了一个有意思的小东西 &#xff0c;使用完全免费哈 《书写我的人生回忆录》是一款软件&#xff0c;其中包含70个问题&#xff0c;涵盖了父母的个人喜好、家庭、工作、人生经历和态度等方面。通过回答这些问题&#xff0c;您的…

使用Cubic 自定义 Ubuntu Live ISO

使用Cubic 自定义 Ubuntu Live ISO 需要使用原始镜像文件&#xff0c;比如使用 systemback 备份系统生成的 ISO 有时候 systemback 生成的 ISO 无法启动&#xff0c;可以用 Cubic 修复 使用 Cubic 安装 sudo apt-add-repository ppa:cubic-wizard/release sudo apt-key ad…

java 线程唤醒于阻塞的常用方法

1.分类描述 1.sleep() 休眠2.suspend() 暂停和 resume() 继续3.yield() 让步 就是我放弃本次执行&#xff0c;但继续排队&#xff0c;下一次有机会在执行。 4.wait() 和 notify() notifyAll() 注&#xff1a;这两个方法&#xff0c;属于Object类&#xff0c;而不属于Thread…

启动 Ethereum(上海) 主网全节点

问题描述 采用最新的geth版本之后&#xff0c;按照之前的方法启动geth主网节点会出现如下问题&#xff1a; Post-merge network, but no beacon client seen. Please launch one to follow the chain!问题原因 The above message is emitted when Geth is run without a conse…

在Windows10中安装WSL2(Ubuntu 22.04.2 LTS)

WSL1 和 WSL2 WSL 1 于 2016 首次发布&#xff0c;在 windows 系统中可以使用linux系统。 但是WSL1的缺点有&#xff1a; 文件 I/O 慢&#xff0c;尤其是在大量IO操作时&#xff0c;例如使用 git 克隆仓库&#xff1b;不支持内核程序&#xff1b; WSL 2 针对以上两个缺点进…

Tc2xx知识点(二) :AURIX单片机基础概念记录

目录 1、概述 2、通用寄存器文件 3、Overlay 4、cache 5、英飞凌Tc275的Eray 6、内存分析(手册)

MyBatis核心配置文件详解

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><environments default"…

3.0、Java继承与多态 - 构造方法的访问特点

3.0、Java继承与多态 - 构造方法的访问特点 在继承关系中&#xff0c;父类构造方法的访问特点&#xff1a; 1、子类构造方法当中有一个默认隐含的 super(); 调用&#xff0c;所以一定是先调用父类构造&#xff0c;然后再去执行子类构造&#xff1b; 2、子类构造可以通过 supe…