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

news2024/12/24 2:23:43

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

什么是窗口函数?

       所谓的窗口函数就是动态处理数据的一类函数,也叫做“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()

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

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.coloradmin.cn/o/902906.html

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

相关文章

C语言知识

C语言知识 链接 C语言中的数组初始化是有三种形式的,分别是: (1)数据类型 数组名称[长度n] {元素1,元素2…元素n}; (2)数据类型 数组名称[] {元素1,元素2…元素n}; (3)数据类型 数组名称[长度n]; 数组名称[0] 元素1; 数组名称[1] 元素2; 数组…

【LeetCode】2236.判断根节点是否等于子节点之和

题目 给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。 如果根结点值等于两个子结点值之和,返回 true ,否则返回 false 。 示例 1: 输入:root [10,4,6] 输出&…

(牛客网)链表相加(二)

嗯哼~ 题目 描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表两个整数相加值的结果链表。 数据范围:0 ≤ n,m ≤ 1000000,链表任意值 0 ≤ val ≤ 9 要求&#x…

Python绘制爱心代码(七夕限定版)

写在前面: 又到了一年一度的七夕节啦!你还在发愁送女朋友什么礼物,不知道怎样表达你满满的爱意吗?别担心,我来帮你!今天,我将教你使用Python绘制一个跳动的爱心,用创意和幽默为这个…

FL Studio21.1中文完整版Win/Mac

FL Studio All Plugins Edition【中文完整版 Win/Mac】适合音乐制作人/工作室使用,全套插件!(20.9新增Vintage Chorus,Pitch Shifter变调插件)FL Studio是超多顶级音乐人的启蒙首选!包括百大DJ冠军Martin Garrix&…

《vue3实战》运用splice方法实现电影评价系统的查看、修改、删除功能

目录 前言 电影评价系统是什么?它能具有什么功能的体现? 一、splice方法的含义和作用 splice是什么?splice的作用体现在哪些方面? 二、功能实现 以下是实现查看逻辑功能的代码 以下是实现修改逻辑功能的代码 以下是实现删…

第 4 章 链表(2)(单链表面试题)

单链表面试题(新浪、百度、腾讯) 单链表的常见面试题有如下: 1.求单链表中有效节点的个数 /*** 单链表*/ public class SingleLinkedListDemo {public static void main(String[] args) {//进行测试//先创建节点HeroNode hero1 new HeroNode(1, "宋江", "及时…

Oracle数据库后悔药之数据回退

在使用plsql工具,对表数据进行操作后,提交了事务,发现数据更新或者删除错了,这时候还是有方法可以把数据回退的,下面进行操作。 对emp表数据进行操作,更新前数据如下所示: 现在对SAL字段进行更…

一文详解多模态认知智能

多模态认知智能是AI人工智能当前发展的主流趋势之一,其核心是以多模态知识的获取,表示与推理为主要内容的跨模态知识工程与认知智能,也是为了更好的处理多模态的数据,需要融合多种感知模态和智能处理技术。 01 多模态认知智能&am…

Vue--进度条

挺有意思的&#xff0c;大家可以玩一玩儿&#xff1a; 前端代码如下&#xff1a;可以直接运行的代码。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&qu…

【项目】BlogTest(Web自动化)

个人博客Web自动化 一、项目背景二、项目功能三、测试计划功能测试自动化测试 一、项目背景 个人 博客系统采用前后端的方法来实现&#xff0c;同时使用了SpringBoot、MySQL、Ajax等相关技术&#xff0c;同时部署到云服务器上。前端主要有四个 页面构成&#xff1a;登录页、列…

Mac上传项目源代码到GitHub的修改更新

Mac上传项目源代码到GitHub的修改更新 最近在学习把代码上传到github&#xff0c;不得不说&#xff0c;真的还挺方便 这是一个关于怎样更新项目代码的教程。 首先&#xff0c;在本地终端命令行打开至项目文件下第一步&#xff1a;查看当前的git仓库状态&#xff0c;可以使用git…

个人博客自动化测试

BlogWebAutoTest 前言一、脑图二、编写代码三、代码测试结果 前言 1.针对个人博客进行测试&#xff0c;个人博客主要有四个页面构成&#xff1a;登录页、列表页、详情页和编辑页&#xff0c;主要功能包括&#xff1a;登录、写博客、删除博客、修改博客、查看详情以及注销等功能…

java面向对象——继承以及super关键字

继承的概念 1. 被继承的类称为父类&#xff08;超类&#xff09;&#xff0c;继承父类的类都称为子类&#xff08;派生类&#xff09; 2. 继承是指一个对象直接使用另一个对象的属性和方法&#xff0c;但是能继承非私有的属性和方法&#xff1b;(1) 构造方法不能被继承。(2) 但…

关于查看处理端口号和进程[linux]

查看端口号 lsof -i:端口号如果-bash: lsof: 未找到命令那我们可以执行yum install lsof 删除端口号进程 一般我们都会使用kill命令 kill -l#列出所有可用信号1 (HUP)&#xff1a;重新加载进程。9 (KILL)&#xff1a;杀死一个进程。15 (TERM)&#xff1a;正常停止一个进程。 …

代码随想录算法训练营day31 | 贪心问题:455. 分发饼干,53. 最大子数组和

目录 455. 分发饼干 ​​​​​​376. 摆动序列 53. 最大子数组和 455. 分发饼干 类型&#xff1a;贪心 难度&#xff1a;medium 思路&#xff1a; 记得先排序&#xff0c;用饼干去满足小孩。 代码&#xff1a; class Solution {public int findContentChildren(int[] g…

从零开始 Spring Cloud 12:Sentinel

从零开始 Spring Cloud 12&#xff1a;Sentinel 1.初识 Sentinel 1.1雪崩问题 1.1.1什么是雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分…

YOLOv5改进系列(22)——替换主干网络之MobileViTv1(一种轻量级的、通用的移动设备 ViT)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

Linux 一个简单的多线程程序

一个简单的多线程程序 编写一个简单的多线程程序 代码如下&#xff1a; 运行结果&#xff1a; 出现这样的运行结果是因为主函数直接就运行完了&#xff0c;直接5次循环就结束了&#xff0c;线程函数还没有来得及执行&#xff0c;整个进程就已经结束了。因为主函数退出之后系统…

MySQL卸载-Linux版

MySQL卸载-Linux版 停止MySQL服务 systemctl stop mysqld 查询MySQL的安装文件 rpm -qa | grep -i mysql 卸载上述查询出来的所有的MySQL安装包 rpm -e mysql-community-client-plugins-8.0.26-1.el7.x86_64 --nodeps ​ rpm -e mysql-community-server-8.0.26-1.el7.x86_64 -…