当前位置: 首页 > 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就是三等奖。

相关文章:

  • Vue.js中computed的使用方法
  • 前端开发深入了解webpack
  • 【中秋月饼系列】2024年立体月饼新鲜出炉----python画月饼(1)附完整代码
  • 【Unity学习心得】如何使用Unity制作“饥荒”风格的俯视角2.5D游戏
  • 【随手笔记】
  • 安宝特案例 | AR如何大幅提升IC封装厂检测效率?
  • 安卓显示驱动
  • Unreal Engine——AI生成高精度的虚拟人物和环境(虚拟世界构建、电影场景生成)(一)
  • 喜报 | 知从科技荣获 “AutoSec 安全之星 - 优秀汽车软件供应链安全方案奖”
  • Linux创建虚拟磁盘并分区格式化
  • 剑灵服务端源码(c#版本+数据库+配套客户端+服务端)
  • 嵌入式学习——数据结构——顺序表
  • 20. 如何在MyBatis中处理多表关联查询?常见的实现方式有哪些?
  • 【代码随想录训练营第42期 Day57打卡 - 图论Part7 - Prim算法
  • 拉取ros2_control_demos存储库
  • AHK 中 = 和 == 等比较运算符的用法
  • C++入门教程(10):for 语句
  • flutter的key在widget list的作用以及必要性
  • IDEA常用插件整理
  • java正则表式的使用
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Material Design
  • Redash本地开发环境搭建
  • Spark RDD学习: aggregate函数
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Web Storage相关
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端设计模式
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • !!Dom4j 学习笔记
  • #stm32驱动外设模块总结w5500模块
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (2)Java 简介
  • (C#)一个最简单的链表类
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • .gitignore文件_Git:.gitignore
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .net生成的类,跨工程调用显示注释
  • .net实现客户区延伸至至非客户区
  • :“Failed to access IIS metabase”解决方法
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [000-002-01].数据库调优相关学习
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [Algorithm][动态规划][简单多状态DP问题][按摩师][打家劫舍Ⅱ][删除并获得点数][粉刷房子]详细讲解
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
  • [BUUCTF]-Reverse:reverse3解析
  • [HackMyVM]靶场 Wild