转载

窗口函数简介

  • MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数。
  • 开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据返回一条结果。
  • 开窗函数也是通过指定字段将数据分成多份,也就是多个窗口,对每个窗口的每一行执行函数,每个窗口返回等行数的结果。
  • 窗口函数分为静态窗口和滑动窗口,静态窗口的大小是固定的,滑动窗口的大小可以根据设置进行变化,在当前窗口下生成子窗口。

语法简介

语法:函数名([参数]) over(partition by [分组字段] order by [排序字段] asc/desc rows/range between 起始位置 and 结束位置)

函数解读:函数分为两个部分,第一部分是函数名称,开窗函数的数量较少,只有11个窗口函数+聚合函数(所有聚合函数都可以用作开窗函数),根据函数性质,有的要写参数,有的不需要写参数;

第二部分是over语句,over()是必须要写的,里面有三个参数,都是非必须参数,根据需求选写:

  1. 第一个参数是 partition by +分组字段,将数据根据此字段分成多份,如果不加partition by参数,那会把整个数据当做一个窗口。
  2. 第二个参数是 order by +排序字段,每个窗口的数据要不要进行排序。
  3. 第三个参数 rows/range between 起始位置 and 结束位置,这个参数仅针对滑动窗口函数有用,是在当前窗口下分出更小的子窗口。其中起始位置和结束位置可写:

current row 边界是当前行,
unbounded preceding 边界是分区中的第一行,
unbounded following 边界是分区中的最后一行,
expr preceding 边界是当前行减去expr的值,
expr following 边界是当前行加上expr的值。
rows是基于行数,range是基于值的大小。

静态窗口函数之排名函数 rank()、dense_rank()

有成绩表sc,字段分别是学生编号s_id,课程编号c_id,成绩score

1、题目描述:按成绩从高到低进行排名

select * ,rank() over(order by score desc) 名次 from sc;

代码解读:rank()是排名函数,不需要参数;over语句里面没有partition by参数,也就是整个数据视为一个窗口;因为rank函数没有参数,但需要指定按照那个字段进行排名,所以使用rank函数必须用order by参数,排序字段就是排名字段,针对分数做降序,就会按照成绩从高到低进行排名;rank函数属于静态窗口,第三个参数写不写没有任何用处。

结果:发现80分的同学都是并列第六,而并列后的下一位同学的名次是11名

但有时候,当出现名次并列时,下一个人的名次是连续的,只需要将rank()函数换成dense_rank(),其他都不需要更改。

select * ,dense_rank() over(order by score desc) 名次 from sc;


2、题目:求每门课程的成绩排名(由高到低)

select * ,rank() over(partition by c_id order by score desc) 名次 from sc;

代码解读:因为要求的是每门课程的排名,也就是课程1和课程2之间相互不影响,需要按照c_id将成绩表分成多份,每个课程是一个窗口,窗口内进行排序并返回排名,最后将多个窗口的结果再拼接再一起。

3、题目:查询每位学生的成绩总分并排名

select s_id,sum(score) 总成绩,rank() over(order by sum(score) desc) 排名 from sc group by s_id;

代码解读:开窗函数的执行顺序是在group by之后的,所以是先针对s_id分组后聚合,得出每个学生的总成绩,之后再执行窗口函数。over语句没有partition by语句,没有进行分窗, 针对总成绩进行排序,根据每个学生的总成绩进行排名。

MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用相关推荐

  1. mysql8 rank_MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用

    窗口函数简介MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数. 开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据返回一条 ...

  2. MYSQL实现排名函数RANK,DENSE_RANK和ROW_NUMBER

    文章目录 1. 排名分类 1.1 区别RANK,DENSE_RANK和ROW_NUMBER 1.2 分组排名 2. 准备数据 3. 不分组排名 3.1 连续排名 3.2 并列跳跃排名 3.3 并列连续 ...

  3. mysql中的排名函数rank()、dense_rank()、row_number()

    排名函数rank().dense_rank().row_number()的比较 1.问题描述 在写LeetCode178. 分数排名时,它的要求是输出"无间隔"的分数排名,于是本文 ...

  4. Oracle排名函数(Rank)实例详解

    这篇文章主要介绍了Oracle排名函数(Rank)实例详解,需要的朋友可以参考下 --已知:两种排名方式(分区和不分区):使用和不使用partition --两种计算方式(连续,不连续),对应函数:d ...

  5. oracle 四分位函数,Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…

    Oracle 分析函数--函数RANK,DENSE_RANK,FIRST,LAST- RANK 功能描述:根据 ORDER BY 子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置.组内 ...

  6. Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…

    Oracle分析函数--函数RANK,DENSE_RANK,FIRST,LAST- RANK 功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置.组内的数据 ...

  7. hive窗口函数之排名函数row_number、rank和dense_rank

    文章目录 简单排名 分组排名 练习1-取前两名学生 练习2-连续签到次数 排名函数主要有row_number.rank和dense_rank. 简单排名 row_number是行号,不会重复,rank ...

  8. oracle rank 语法_Oracle排名函数(Rank)实例详解

    -- 已知:两种排名方式 ( 分区和不分区 ): 使用和不使用 partition -- 两种计算方式 ( 连续 , 不连续 ), 对应函数: dense_rank,rank ·查询原始数据:学号 , ...

  9. excel排名_WPS-Excel表格实用技巧——排位排名函数(RANK函数)的使用

    平时使用excel表格处理数据时经常会用到排序功能,一般使用"升序"和"降序"工具按钮就可以完成简单的排序任务,但是当我们遇到相同数值在总体中的排名时,简单的& ...

最新文章

  1. ubuntu18.04上安装TensorFlow2.0
  2. android高仿微信UI点击头像显示大图片效果
  3. oracle 触发器 和 常用内置程序包
  4. PHP通过URL传递session_id
  5. CSU 1779: 错误的算法【矩阵/模拟】
  6. java如何实现开机启动,怎样实现开机启动holer
  7. mac os 开启redis_关于Redis,学会这8点就够了
  8. 微信暂停新用户注册标志一个时代的结束
  9. python get 函数-python的__get__、__set__、__delete__(1)
  10. 21SkypeForBusiness2015进阶篇--SFB后端Mirror切换到AllwaysOn--标准版准备篇
  11. 技术原理丨超高精准度IP地址定位这样实现
  12. wps指定路径不存在怎么办_wps临时目录不存在提示该如何解决?
  13. 1分钟链圈 | 有趣!BM评价V神新共识算法:这是「非拜占庭容错机制」的终结者...
  14. 微信小程序实践——实验4高校新闻网
  15. Eclipse 官方网站
  16. 升级Android8.0系统原来APP图标变为小机器人的问题
  17. js-DOM offsetLeft 属性与 offsetTop 属性,制作网页动画等必学知识!
  18. CTF—RGB三原色
  19. 打造自己的 APP「冰与火百科」(一):分析定位
  20. 2022,又一批AI大牛从大厂出走了

热门文章

  1. Visual Studio2017实现DataGridView控件数据导出Excel表格
  2. python中sinxcosy,是1+cosx的一个原函数;的一个原函数是1+cosx
  3. python学习之二次方程求解
  4. 金额:元与分之间转换
  5. 多元线性相关Matlab代码
  6. JavaScript实现二代身份证号码转一代身份证号码
  7. VLAN的作用及用法详解_01
  8. python爬虫批量下载高清大图
  9. java $ 解析api_Java 版抖音解析接口
  10. 记一次蚂蚁金服Java面试被虐经历