SQL助你面大厂(窗口函数)

       在面试过程中窗口函数的应用可谓是数不胜数,前提你要知道什么是窗口函数,最常用的窗口函数有哪些?语法是什么?分别用的场景是什么?今天会以这三个问题开始我们今天的学习

什么是窗口函数?

       所谓的窗口函数就是动态处理数据的一类函数,也叫做“OLAP”函数,可以对数据库数据进行实时分析处理,“窗口函数”由两部分组成:分析函数+窗口函数

--模板
函数名(字段名) over(partition by xxx,yyy order by zzz)--详细介绍
分析函数 over (partition by "要分组的列")order by "要排序的列"rows between "开始的行" and "结束的行")

       over()部分才是“窗口函数”,只不过因为它的特点大家都这样叫,其作用就是划定窗口,分析函数的作用是在窗口内对记录进行统计

over函数中有3个参数

  • partition by

       其表示的是分区或者分组,可以理解成为group by,但是低位有所不同,如果partition by 和group by 后的字段相同,partition by 就会失效,因为group by先分组(划分窗口),如果字段相同则partition by 就没有可分的了

如果partition函数想要做到像group by一样的效果,必须要和distinct关键字进行去重

  • order by

       表示排序,排序、累加都是有排序的操作在里面,根据设么条件排名、根据什么条件进行累加,order by后面可以跟一个字段也可以跟多个字段,位置优先,越在前面排序的优先级越高,默认“asc(升序)” 小-大,desc(降序)大-小

  • rows between "开始的行" and "结束的行"

这部分是控制窗口大小的地方,一般默认就行,也不会进行书写,但是也可以自定义窗口大小:

proceding:往前
following:往后
unbounded:无穷尽的
current row:当前行
unbounded proceding:往前所有行
unbounded following:往后所有行

 举几个例子方便理解:

rows between 2 preceding and current row         --取当前行和前2行,这个可用于求移动平均 
rows between current row and 2 following         --取当前行和后2行,这个可用于求移动平均
rows between unbounded preceding and current row --取当前行和之前所有行,这个可用于求累加;如果没有写rows between参数,则默认的窗口就是这个范围
rows between current row and unbounded following --取当前行和之后所有行
rows between 2 preceding and 2 following         --取当前行的前面2行和下面2行,总共5行,这个可用于求移动平均

动态窗口的动态演示图:

动图

 接下来我们来讲一般常用的三种窗口函数:

我们现在有一个班级的成绩数据,要求按规定进行查询:

CREATE TABLE class(
cid VARCHAR(10),
NAME VARCHAR(20),
grades INT
)
DROP TABLE classINSERT INTO class (cid,NAME,grades) VALUES('1','路飞',60),('1','鸣人',70),('1','佐助',75),('1','萧炎',80),('1','唐三',90),('1','奕星',91),('2','霸天虎',50),('2','玉环',60),('2','索隆',66),('2','墨子',85),('2','铁甲小宝',89)

       假如动漫学院期末成绩出来了,老师让你帮根据一定的规则去查询成绩,你可以帮忙完成这个工作么?

  • 聚合类的窗口函数 sum() over()(举例)       count\avg\max\min

情境一:现在要求让每位同学后面都新增一列各自班级的总分

SELECT*,SUM(grades) OVER (PARTITION BY cid) AS "班级总分"
FROM class

 情境二:计算同一个班级内,每个同学和比他分数低的总分是多少?

SELECT*,SUM(grades) OVER (PARTITION BY cid ORDER BY grades) AS "累加分数"
FROM class

SELECT*,SUM(grades) OVER (PARTITION BY cid ORDER BY grades ROWS BETWEEN unbounded preceding AND current ROW ) AS "累加分数"
FROM class

 这条SQL语句的效果和上面那条SQL语句效果一致,不写的话默认就是这个范围

  • 排序类的窗口函数

  1. row_number(顺序,相同的不做特别处理)

    假如现在让你将1、2班的成绩排个名,从低到高,你有没有什么好的办法?|
    SELECT *,ROW_NUMBER() OVER (PARTITION BY cid ORDER BY grades DESC) AS "成绩排名"
    FROM class;

  2. rank(相同的做特别处理,会进行占位)

           在拍完名之后,发现相同成绩的同学居然排名不一样,这又让老师犯难了,怎么样才能使得相同成绩的同学拥有相同的排名
    SELECT *,RANK() OVER (PARTITION BY cid ORDER BY grades DESC) AS "成绩排名"
    FROM class;

  3. dense_rank(相同的做特殊处理,不占位)

           但是又新出现了一个问题,相同的成绩的排名确实排名也相同了,但是后面的那个同学居然是从3开始的,自动的将2跳过了,这也是我们不希望看到的
     
    SELECT *,DENSE_RANK() OVER (PARTITION BY cid ORDER BY grades DESC) AS "成绩排名"
    FROM class;

  • 偏移类的、跨行的窗口函数
  1. lag(后面)

    如果现在又有一个任务,让每位同学知道比自己低1(N)名的同学的成绩
     
    SELECT*,
    LAG(grades,1) OVER (PARTITION BY cid ORDER BY grades) AS "低一名的成绩"
    FROM class

    但是最后的结果中却出现了null值,我们想如果查不到数据结果置为0,该怎么去实现呢?
    LAG(字段,差值,默认值)
     
    SELECT*,
    LAG(grades,1,0) OVER (PARTITION BY cid ORDER BY grades) AS "低一名的成绩"
    FROM class

  2. 2.lead(前面)

 如果现在又有一个任务,让每位同学知道比自己高1(N)名的同学的成绩


SELECT*,
LEAD(grades,1,0) OVER (PARTITION BY cid ORDER BY grades) AS "高一名的成绩"
FROM class

 最常用的窗口函数已经介绍完了,学习SQL的路上一路有我!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/46206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS设计规范是什么?都有哪些具体规范

iOS设计规范是苹果为移动设备操作系统iOS制定的设计指南。iOS设计规范的制定保证了苹果应用在外观和操作上的一致性和可用性,从而提高了苹果界面设计的用户体验和应用程序的成功性。本文将从七个方面全面分析iOS设计规范。 1.iOS设计规范完整版分享 由「即时设计」…

V2board缓存投毒漏洞复现

1.什么是缓存投毒 缓存投毒(Cache poisoning),通常也称为域名系统投毒(domain name system poisoning),或DNS缓存投毒(DNS cache poisoning)。它是利用虚假Internet地址替换掉域名系…

【Django】Task2 了解models和使用admin后台

文章目录 【Django】Task2 了解models和使用admin后台1.什么是models1.1常用字段类型说明1.2常用配置参数1.3models示例 2.使用Django的admin管理模块2.1admin管理模块介绍2.2创建管理员用户2.3定义models实体对象2.4注册对象2.5合并数据库2.6启动项目并进入管理后台 3.springb…

通过cpolar在外远程查看家里内网监控

通过cpolar在外远程查看家里内网监控 文章目录 通过cpolar在外远程查看家里内网监控前言1. 在cpolar官网预留一个空白隧道2. 完成空白数据隧道,生成地址3. 设置空白隧道的出口4. 空白数据隧道的出口设置5. 获取公网地址6. 打开本地电脑“远程桌面”7. 打开Windows自…

unity打造路径编辑与导航系统

Unity是一款非常流行的游戏引擎,它提供了丰富的工具和API,方便开发者快速创建游戏。其中,路径编辑与导航系统是游戏开发中非常重要的一部分,可以帮助玩家更好地探索游戏世界,提升游戏体验。本文将详细介绍如何在Unity中…

C++对象模型实验(clang虚函数表结构)

摘要:本科期间有对比过msvc,gcc,clang的内存布局,距今已经6-7年了,当时还是使用的c11。时间过得比较久了,这部分内容特别是内存对齐似乎C17发生了一些变化,因此再实践下C类模型。本文描述了C不同…

用easyui DataGrid编辑树形资料

easyui显示编辑树形资料有TreeGrid元件,但是这个元件的vue版本和react版本没有分页功能。virtual scroll功能也表现不佳。 我用DataGrid来处理。要解决的问题点: (1)如何显示成树形。即,子节点如何有缩进。 先计算好…

clickhouse-监控配置

一、概述 监控是运维的一大利器,要想运维好clickhouse,首先就要对其进行监控,clickhouse有几种监控数据的方式,一种是系统本身监控,一种是通过exporter来监控,下面分别描述一下 二、系统自带监控 我下面会对监控做一…

【学习日记】【FreeRTOS】时间片的实现

前言 本文以野火的教程和代码为基础,对 FreeRTOS 中时间片的概念作了解释,并且给出了实现方式,同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中,我们已经知道任务根据不同的优先级被放入就绪列表中不…

计算机竞赛 python的搜索引擎系统设计与实现

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python的搜索引擎系统设计与实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:5分创新点:3分 该项目较为新颖&#xff…

1、攻防世界第一天

1、网站目录下会有一个robots.txt文件,规定爬虫可以/不可以爬取的网站。 2、URL编码细则:URL栏中字符若出现非ASCII字符,则对其进行URL编码,浏览器将该请求发给服务端;服务端会可能会先对收到的url进行解码&#xff0…

深度解读波卡 2.0:多核、更有韧性、以应用为中心

本文基于 Polkadot 生态研究院整理,有所删节 随着波卡 1.0 的正式实现,波卡于 6 月 28 日至 29 日在哥本哈根举办了年度最重要的会议 Polkadot Decoded 2023,吸引了来自全球的行业专家、开发者和爱好者,共同探讨和分享波卡生态的…

ByteV“智农”平台--数字乡村可视化

“智农”平台基于自主可控的数字孪生技术、物联网技术、大数据技术,构建全流程的新型农业一体化管理平台,围绕产运销管理全流程,实现生产->存储->包装->运输->销售的全链条管理。融合农业数据管理、农业数据预警显示、多维数据综…

达梦数据库8用户管理以及忘记sysdba密码修改办法

达梦数据库8用户管理&达梦数据库v8忘记sysdba密码,修改办法。 达梦数据库8用户管理1.创建用户的语法:2.锁定/解锁用户3.修改用户的密码(同样要符合密码策略PWD_POLICY)4.修改用户默认表空间5.删除用户6.同样地可以使用DM管理工具进行创建…

【工具】 删除Chrome安装的“创建快捷方式”

创建Chrome的快捷方式,可以放在桌面,想用时双击就可以打开网页,比书签(brookmark)结构化管理更方便。 但是,安装一时爽,卸载有问题。 如果用 windows 控制面板\所有控制面板项\程序和功能 卸载…

Facebook 应用未启用:这款应用目前无法使用,应用开发者已得知这个问题。

错误:Facebook 应用未启用:这款应用目前无法使用,应用开发者已得知这个问题。应用重新启用后,你便能登录。 「应用未经过审核或未发布」: 如果一个应用还没有经过Facebook的审核或者开发者尚未将应用发布,那么它将无法…

java学习004

常用数据结构对应 php中常用的数据结构是Array数组,相对的在java开发中常用的数据结构是ArrayList和HashMap,它们可以看成是array的拆分,一种简单的对应关系为 PHPJAVAArray: array(1,2,3)ArrayListlArray: array(“name” > “jack”,“…

基于YOLOv8模型和PCB电子线路板缺陷目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型PCB电子线路板缺陷目标检测系统可用于日常生活中检测与定位PCB线路板瑕疵,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检…

算法leetcode|72. 编辑距离(rust重拳出击)

文章目录 72. 编辑距离:样例 1:样例 2:提示: 分析:题解:rust:二维数组(易懂)滚动数组(更加优化的内存空间) go:c:python&a…