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 class

INSERT 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的路上一路有我!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLite数据库实现数据增删改查

当前文章介绍的设计的主要功能是利用 SQLite 数据库实现宠物投喂器上传数据的存储,并且支持数据的增删改查操作。其中,宠物投喂器上传的数据包括投喂间隔时间、水温、剩余重量等参数。 实现功能: 创建 SQLite 数据库表,用于存储宠…

【OFDM系列】DFT为什么能求频率幅度谱?DFT后的X[k]与x(n)幅度的关系?DFT/IDFT底层数学原理?

文章目录 问题引入铺垫一些小公式DFT公式证明DFT公式分解为4部分先考虑k10的情况:再考虑k1≠0的情况: DFT计算后,X(k)与x(n)的关系: Matlab FFT示例代码IDFT公式证明Matlab调用FFT/IFFT并绘图 问题引入 上面是DFT和IDFT的公式,IDFT先不谈。在…

构建 NodeJS 影院微服务并使用 docker 部署它(02/4)

一、说明 构建一个微服务的电影网站,需要Docker、NodeJS、MongoDB,这样的案例您见过吗?如果对此有兴趣,您就继续往下看吧。 图片取自网络 — 封面由我制作 这是✌️“构建 NodeJS 影院微服务”系列的第二篇文章。 二、对第一部分的…

netty(一):NIO——处理消息边界

处理消息边界 为什么要处理边界 因为会存在半包和粘包的问题 1.客户端和服务端约定一个固定长度 优点:简单 缺点:可能造成浪费 2.客户端与服务端约定一个固定分割符 *缺点 效率低 3.先发送长度,再发送数据 TLV格式: type…

Git分布式版本控制系统

目录 2、安装git 2.1 初始环境 2.2 Yum安装Git 2.3 编译安装 2.4 初次运行 Git 前的配置 2.5 初始化及获取 Git 仓库 2.6 Git命令常规操作 2.6.2 添加新文件 2.6.3 删除git内的文件 2.6.4 重命名暂存区数据 2.6.5 查看历史记录 2.6.6 还原历史数据 2.6.7 还原未来…

星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来

目录 前言 一、监听按键并作出判断 二、持续移动 三、左右移动 总结: 前言 今天开始正式操控我们的小蜜蜂了,之前学java的时候是有一个函数监听鼠标和键盘的操作,我们通过传过来不同的值进行判断,现在来看看python是否一样的实现…

lvs-DR

lvs-DR数据包流向分析 client向目标VIP发出请求。 DIR根据负载均衡算法一台active的RS(RIR1),将RIP1所在的网卡的mac地址作为目标的mac地址,发送到局域网里。 RIRI在局域网中的收到这个帧,拆开后发现目标&#xff08…

【ARM】Day4 点亮LED灯

1. 思维导图 2. 自己编写代码实现三盏灯点亮 .text .global _start _start: /**********LED1,LED2,LED3点灯:PE10,PF10,PE8**************/ RCC_INIT:使能GPIOE组/GPIOF组控制器,通过RXCC_MP_AHB4ENSETR设置第[5:4]位写1,地址:0x50000A28[5:4]1ldr r0,0x50000A28 …

【SA8295P 源码分析】03 - SA8295P QNX Host上电开机流程分析

【SA8295P 源码分析】03 - SA8295P QNX Host上电开机流程分析 一、阶段1 固件开机自检 (SM BIST):APPS PBL加载XBL后触发 INT_RESET进行Warm Reset二、阶段2 固件开机自检 (SM BIST):加载TZ,初始Hypervisor,启动QNX Kernel&#x…

22年电赛B题——具有自动泊车功能的电动车——做题记录以及经验分享

前言 这道题目也是小车类电赛题目,十月份的电赛题,由于之前积累了一些经验,这道题目在做下来的感觉还行,但是我们看题目没有仔细审题,和题目要求有一些些偏差,但是基础大功能还是做出来辽,大家还是可以参考…

LeetCode283.移动零

这道题还是很简单的,我用的是双指针,左指针i从头开始遍历数组,右指针j是从i后面第一个数开始遍历,当左指针i等于0的时候,右指针j去寻找i右边第一个为0的数和i交换位置,交换完了就break内层循环,…

Linux网络编程:网络基础

文章目录: 一:协议 二:网络应用设计模式_BS模式和CS模式 三:网络分层模型(OSI七层 TCP/IP四层) 四:通信过程 五:协议格式 1.数据包封装 2.以太网帧格式和ARP数据报格式 …

【SA8295P 源码分析】06 - SA8295P XBL Loader 阶段 sbl1_main_ctl 函数代码分析

【SA8295P 源码分析】06 - SA8295P XBL Loader 阶段 sbl1_main_ctl 函数代码分析 一、XBL Loader 汇编源码分析1.1 解析 boot\QcomPkg\XBLLoader\XBLLoader.inf1.2 boot\QcomPkg\XBLDevPrg\ModuleEntryPoint.S:跳转 sbl1_entry 函数1.3 XBLLoaderLib\sbl1_Aarch64.s…

Communication Channels

沟通渠道 n * (n - 1) / 2 你1 相关方3 4 4 * 3 / 2 6 你1 相关方3 相关方1 5 5 * 4 / 2 10 人越多,沟通渠道越多,沟通成本理论越高

Roxy-Wi 命令执行漏洞复现

漏洞描述 Roxy-WI是开源的一款用于管理 Haproxy、Nginx 和 Keepalived 服务器的 Web 界面 Roxy-WI 6.1.1.0 之前的版本存在安全漏洞,该漏洞源于系统命令可以通过 subprocess_execute 函数远程运行,远程攻击者利用该漏洞可以执行远程代码。 免责声明 技术文章仅供参考,任…

jstack(Stack Trace for Java)Java堆栈跟踪工具

jstack(Stack Trace for Java)Java堆栈跟踪工具 jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。 线程快照就是当前虚拟机内每一条线程正在执…

使用预制体画刷在游戏场景中快速布置预制体、粒子特效等

有时候在使用tilemap的时候,会希望在场景中添加更复杂的对象。 在2d-extras中,加入了预制件笔刷(Prefab Brush),可以将游戏物体预制体作为瓦片,来方便的在游戏场景中快速的绘制。可以自动适应游戏物体的位置…

GitHub 开启 2FA 双重身份验证的方法

最近收到GitHub官方发来的邮件,全是英文的,如图: 使用邮箱翻译插件,进行翻译,哦,原来是要我进行2FA注册,如果不注册,GitHub的访问将收到限制,所以还是得注册一下 然后怎…

【Redis基础篇】浅谈分布式系统(一)

一、浅谈分布式系统 1. 单机架构:只有一台服务器,这个服务器负责所有的工作。 如果遇到了服务器不够的场景怎么处理? 开源:增加更多的硬件资源节流:软件上的优化,优化代码等…一台服务器资源使用有限,就…

无涯教程-PHP - 常量声明

常量值不能更改。默认情况下,常量区分大小写。按照约定,常量标识符始终为大写。与变量不同,您不需要具有"$"的常量。 constant 函数 如名称所示,此函数将返回常量的值。 当您要检索常量的值但不知道其名称时&#xf…