当前位置: 首页 > news >正文

MySQL高级功能-窗口函数

背景

最近遇到需求,需要对数据进行分组排序并获取每组数据的前三名。
一般涉及到分组,第一时间就是想到使用group by对数据进行分组,但这样分组,到最后其实只能获取到每组数据中的一条记录。
在需要获取每组里面的多条记录的时候,就实现不了了。就算能实现,也得用上比较复杂的SQL嵌套或者业务层实现。

窗口函数

这个时候,就该想到我们的窗口函数了,在MySQL8开始支持窗口函数。
通过窗口函数,可以很轻易地实现数据分组并获取分组内的多条记录。
并且有多种效果的获取排序方式。

语法:
SELECT 窗口函数() OVER(PARTITION BY 字段 ORDER BY 字段) FROM 表
可以把中间的“ 窗口函数() OVER(PARTITION BY 字段 ORDER BY 字段)”看成是一个函数,处理数据并获取到记录的排序值。

RNAK()

RNAK()对数据进行排序,从1开始,不一定连续,如果排序值相同,则名次一样,后面的排名会按照排在前面有多少数据去算。如有两个第二名,那么直接就没有第三名,下一个直接到第四名。

SELECT id,RANK() OVER(PARTITION BY subject ORDER BY score DESC) AS num,subject,name,score FROM test

在这里插入图片描述
看math的数据,因为tom和jack的成绩一样,所以他们都是第二名,而lala直接到了第四名,也就是没有第三名。

ROW_NUMBER()

对相等的排序值不进行区分,也就是即使排序值相同对应的排名也不同,序号从1到n连续。

SELECT id,ROW_NUMBER() OVER(PARTITION BY subject ORDER BY score DESC) AS num,subject,name,score FROM test

在这里插入图片描述
如上图,tom和jack的math分数是一样的,但是还是会强行给他们分出先后顺序。

DENSE_RANK()

对于相同的排序值,则排名相同,排名从1开始连续。如,有两个排第二,下一个就是序号3。(和一、二、三等奖算法差不多)

SELECT id,DENSE_RANK() OVER(PARTITION BY subject ORDER BY score DESC) AS num,subject,name,score FROM test
在这里插入图片描述
如上图,tom和jack的math并列二等奖,lala就是三等奖。


http://www.mrgr.cn/news/25558.html

相关文章:

  • 软件测试面试题:如何测试App性能?
  • 如何保证Redis和MySQL两者之间数据的一致性
  • 多线程篇(其它容器- ConcurrentSkipListSet)(持续更新迭代)
  • 【Windows 系统自带故障诊断工具介绍】
  • 数据库系统 第53节 数据库并发控制
  • QT绘图控件
  • mysql中清空表数据使用delete和turncate的区别
  • MySQL--库的操作
  • HarmonyOS NEXT 封装实现好用的网络模块(基于最新5.0的API12)
  • 代码随想录刷题day30丨452. 用最少数量的箭引爆气球, 435. 无重叠区间,763.划分字母区间
  • Vue 2和Vue 3区别以及实现原理
  • 同步 异步 阻塞 非阻塞
  • [GYCTF2020]Blacklist1
  • 深入探索 Ubuntu:从基础到高级应用
  • Lesson08---string类(3)
  • 第二期: 第四节, 裸机编程 LED 汇编代码。
  • 质量小议45 - 粒度
  • 2024.9.12
  • 企业数字化转型、建设和升级面临的主要难题和解决之道(2)
  • 书接上文,介绍下Quartz Java体系结构