MySQL使用窗口函数ROW_NUMBER()、DENSE_RANK()查询每组第一名或每组前几名,窗口函数使用详解

MySQL数据表结构

创建 tbl_class_info 表,表中有四个字段 id、username、score、group_name

使用 ROW_NUMBER()、DENSE_RANK() 查询每组前三名

-- 查询每组前3名
SELECT username, score, group_name  
FROM (  SELECT username, score, group_name,  ROW_NUMBER() OVER (PARTITION BY group_name ORDER BY score DESC) AS test_rank,DENSE_RANK() OVER (PARTITION BY group_name ORDER BY score DESC) AS test_dense_rank  FROM tbl_class_info 
) AS ranked_scores  
WHERE test_rank <= 3 OR test_dense_rank <= 3

查询结果:

使用 ROW_NUMBER()、DENSE_RANK() 查询第二名

-- 查询每组第2名
SELECT username, score, group_name  
FROM (  SELECT username, score, group_name,  ROW_NUMBER() OVER (PARTITION BY group_name ORDER BY score DESC) AS test_rank FROM tbl_class_info 
) AS ranked_scores  
WHERE test_rank = 2

查询结果:

使用 ROW_NUMBER()、DENSE_RANK() 查询结果是不同的,

ROW_NUMBER()和DENSE_RANK()是常见的窗口函数,它们可以用于对结果集中的行进行排序和编号,它们的主要区别在于 使用DENSE_RANK()函数为每个组(group_name)中的记录根据成绩(score)降序排列,并为每组中的行分配一个唯一的序号(rank

与ROW_NUMBER()不同,如果存在相同的成绩,DENSE_RANK()会为它们分配连续的序号,而不会跳过任何数字。下面是实例说明:

ROW_NUMBER()、DENSE_RANK() 区别详解

使用ROW_NUMBER()查询数据:

SELECTusername,score,group_name,ROW_NUMBER() OVER (PARTITION BY group_name
ORDER BYscore DESC) AS rank_number
FROMtbl_class_info;

执行结果可以看到,即使成绩(score)相同,rank_number 序号也是不同的

使用 DENSE_RANK() 查询数据:

SELECTusername,score,group_name,DENSE_RANK() OVER (PARTITION BY group_name
ORDER BYscore DESC) AS rank_number
FROMtbl_class_info;

执行结果可以看到,即使成绩(score)相同,rank_number 序号也是相同的

所以总的来说,ROW_NUMBER() 和 DENSE_RANK() 都是非常有用的窗口函数,它们可以用于各种数据分析任务。但是,它们之间的区别意味着它们适用于不同的场景。如果您需要为每个行分配唯一的数字,即使在有重复值的情况下也是如此,那么 ROW_NUMBER() 是更好的选择。如果您需要为每个行分配唯一的数字,但如果有重复值,则需要跳过重复值,那么 DENSE_RANK() 是更好的选择。

MySQL窗口函数的使用语法

SELECT <窗口函数> OVER ([PARTITION BY <表达式>][ORDER BY <表达式>][ROWS BETWEEN <表达式> AND <表达式>]
)
FROM <表名>

 其中: 

  • <窗口函数>  是窗口函数的名称。 
  • PARTITION BY <表达式>  是分区表达式。分区表达式用于将表中的行分成多个分区。 
  • ORDER BY <表达式>  是排序表达式。排序表达式用于对分区中的行进行排序。 
  • ROWS BETWEEN <表达式> AND <表达式>  是行范围表达式。行范围表达式用于指定窗口函数计算的行的范围。
SELECTgroup_name,AVG(score) OVER (PARTITION BY group_name
ORDER BYscore DESC ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS avg_sales
FROMtbl_class_info;

执行结果:

注:在窗口函数中,ROWS BETWEEN <表达式> AND <表达式> 用于指定窗口的边界范围。这个范围是根据指定的表达式来确定的。通常,第一个表达式指定了窗口的起始行,第二个表达式指定了窗口的结束行。

在计算窗口函数之前,数据库会先确定窗口的范围。然后,根据指定的窗口范围,对范围内的行进行运算。通常,窗口函数会对窗口内的每一行执行计算,并返回一个与窗口范围相对应的结果。
 

MySQL中常见的窗口函数有哪些

  SUM()函数:计算指定列的总和。

SELECT column1, SUM(column2) OVER (PARTITION BY column1) AS total_sum  
FROM table;

  AVG()函数:计算指定列的平均值。

SELECT column1, AVG(column2) OVER (PARTITION BY column1) AS average_value  
FROM table;

  MIN()函数:返回指定列的最小值。

SELECT column1, MIN(column2) OVER (PARTITION BY column1) AS minimum_value  
FROM table;

  MAX()函数:返回指定列的最大值。

SELECT column1, MAX(column2) OVER (PARTITION BY column1) AS maximum_value  
FROM table;

  COUNT()函数:计算指定列的非空值的数量。

SELECT column1, COUNT(column2) OVER (PARTITION BY column1) AS count_value  
FROM table;

  RANK()函数:返回一组行的排名。

SELECT column1, RANK() OVER (ORDER BY column2 DESC) AS rank_value  
FROM table;

  DENSE_RANK()函数:返回一组行的不间断排名。

SELECT column1, DENSE_RANK() OVER (ORDER BY column2 DESC) AS dense_rank_value  
FROM table;

  ROW_NUMBER()函数:为一组行分配一个唯一的数字。

SELECT column1, ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2 DESC) AS row_number_value  
FROM table;

MySQL窗口函数和聚合函数的区别

窗口函数和聚合函数都是在数据库中对数据进行计算的函数。但是,它们之间有一些关键区别。 

  • 窗口函数返回一个单个值,该值是基于一组行计算的。这组行称为窗口。窗口函数可以使用窗口中的所有行,也可以使用窗口中的部分行。 
  • 聚合函数返回一个单个值,该值是基于整个表中的数据计算的。聚合函数不能使用窗口,因为它们需要访问整个表的数据才能计算结果。 
SELECT SUM(sales) FROM orders;SELECT SUM(sales) OVER (PARTITION BY product_id ORDER BY order_date);

第一个查询使用聚合函数 SUM 计算整个表中所有订单的总销售额。
第二个查询使用窗口函数 SUM 计算每个产品的总销售额。窗口函数 SUM 使用 ORDER BY 子句对订单按日期排序,然后计算每个产品的总销售额。 
窗口函数和聚合函数都是在数据库中对数据进行计算的强大工具。但是,它们之间有一些关键区别,因此在选择使用哪种函数时需要考虑这些区别。

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

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

相关文章

目标检测——R-FCN算法解读

论文&#xff1a;R-FCN: Object Detection via Region-based Fully Convolutional Networks 作者&#xff1a;Jifeng Dai, Yi Li, Kaiming He and Jian Sun 链接&#xff1a;https://arxiv.org/pdf/1605.06409v2.pdf 代码&#xff1a;https://github.com/daijifeng001/r-fcn 文…

5.鸿蒙hap可以直接点击包安装吗?

5.鸿蒙hap可以直接点击包安装吗&#xff1f; hap与apk不同&#xff0c;获取的hap不能直接安装 安装方法1&#xff1a; DevEco studio打开项目源文件&#xff0c;打开手机USB调试&#xff0c;DevEco识别到手机后&#xff0c;点击播放按钮安装到手机 https://txwtech.blog.cs…

Rust 通用代码生成器莲花发布红莲尝鲜版十八介绍视频,初学者指南

Rust 通用代码生成器莲花发布红莲尝鲜版十八介绍视频&#xff0c;初学者指南 Rust 通用代码生成器莲花发布深度修复版红莲尝鲜版十八介绍视频&#xff0c;初学者指南&#xff0c;详细介绍代码生成器环境搭建&#xff0c;编译&#xff0c;运行和使用代码生成物&#xff0c;欢迎…

nginx中的正则表达式及location和rewrite

目录 常用的Nginx 正则表达式 location和rewrite的区别 location location 大致可以分为三类 location 常用的匹配规则 location 优先级 location 示例说明 location优先级的总结 rewrite rewrite的功能 rewrite实现跳转的条件 rewrite的执行顺序 rewrite的语法格式…

ARM day3

题目&#xff1a;实现3盏灯的流水 代码&#xff1a; .text .global _start _start: 设置RCC寄存器使能 LDR R0,0X50000A28 LDR R1,[R0] ORR R1,R1,#(0X1<<4) ORR R1,R1,#(0X1<<5) STR R1,[R0]设置PE10管脚为输出模式 LDR R0,0X50006000 LDR R1,[R0] BIC R1,R1,…

文心ERNIE Bot SDK+LangChain:基于文档、网页的个性化问答系统

现在各行各业纷纷选择接入大模型&#xff0c;其中最火且可行性最高的形式无异于智能文档问答助手&#xff0c;而LangChain是其中主流技术实现工具&#xff0c;能够轻松让大语言模型与外部数据相结合&#xff0c;从而构建智能问答系统。ERNIE Bot SDK已接入文心大模型4.0能力&am…

如何使用Imagewheel本地搭建一个简单的的私人图床公网可访问?

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

Java:字符流 文件输出 与 读入 方法

Java&#xff1a;字节流 文件输出与读入方法 并 实现文件拷贝 文章目录 字符流FileReaderFileWrite 字符流 字符流底层就是字节流。 字符流 字节流 字符集 特点&#xff1a; 输入流&#xff1a;一次读入一个字节&#xff0c;遇到中文时&#xff0c;一次读多个字节。 输出流…

POJ-2777 Count Color

经典区间染色板子题 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N 1e610; struct Segment{int l,r,id; }tr[N<<2]; int n,color,m;void pushdown(int u){if(tr[u].id){tr[u<<1].id tr[u<&l…

计算机视觉之手势、面部、姿势捕捉以Python Mediapipe为工具

计算机视觉之手势、面部、姿势捕捉以 Python Mediapipe为工具 文章目录 1.Mediapipe库概述2.手势捕捉(hands)3.面部捕捉(face)4.姿势捕捉(pose) 1.Mediapipe库概述 Mediapipe是一个开源且强大的Python库&#xff0c;由Google开发和维护。它提供了丰富的工具和功能&#xff0c…

stm32学习总结:3、Proteus8+STM32CubeMX+MDK很有搞头

stm32学习总结&#xff1a;3、Proteus8STM32CubeMXMDK很有搞头 文章目录 stm32学习总结&#xff1a;3、Proteus8STM32CubeMXMDK很有搞头一、前言二、资料收集三、实际案例-点灯1、Proteus8安装2、Proteus创建stm32F013C6项目并添加外围LED电路3、STM32CubeMX配置F103C6引脚生成…

12.10_黑马数据结构与算法笔记Java

目录 058 链表 e10 判环算法1 thinking&#xff1a;什么是空指针&#xff1f; 058 链表 e10 判环算法2 059 数组 e01 合并有序数组1 059 数组 e01 合并有序数组2 060 队列 链表实现1 061 队列 链表实现2 062 队列 环形数组实现 方法1-1 063 队列 环形数组实现 方法1-2…

带有 RaspiCam 的 Raspberry Pi 监控和延时摄影摄像机

一、说明 一段时间以来&#xff0c;我一直想构建一个运动激活且具有延时功能的树莓派相机&#xff0c;但从未真正找到我喜欢的案例。我在thingiverse上找到了这个适合树莓派和相机的好案例。它是为特定的鱼眼相机设计的&#xff0c;但从模型来看&#xff0c;我拥有的廉价中国鱼…

【Vulnhub 靶场】【Hackable: III】【简单 - 中等】【20210602】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hackable-iii,720/ 靶场下载&#xff1a;https://download.vulnhub.com/hackable/hackable3.ova 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年06月02日 文件大小&#xff1a;1.6 GB 靶场作者&…

Docker | 自定义网络

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨特色专栏: MySQL学习 🥭本文内容: Docker | 自定义网络 📚个人知识库: 知识库,欢迎大家访问 1.前言 大家好,我是Leo哥…

当视觉遇到毫米波雷达:自动驾驶的三维目标感知基准

​ 文章&#xff1a;Vision meets mmWave Radar: 3D Object Perception Benchmark for Autonomous Driving 作者: Yizhou Wang, Jen-Hao Cheng, Jui-Te Huang , Sheng-Yao Kuan , Qiqian Fu , Chiming Ni 编辑&#xff1a;点云PCL 欢迎各位加入知识星球&#xff0c;获取PDF…

vector类

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉vector库 > 毒鸡汤&#xff1a;从人生低谷…

【面试总结】Java面试题目总结(一)

&#xff08;以下仅为个人见解&#xff0c;如果有误&#xff0c;欢迎大家批评并指出错误&#xff0c;谢谢大家&#xff09; 1.项目中的验证码功能是如何实现的&#xff1f; 第一步&#xff1a;在项目的pom.xml文件中导入 EasyCaptcha 的依赖&#xff1b; <dependency>…

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG 2023/12/7 23:50 SDK&#xff1a;rk356x_android12_220722.tgz 只修改DTS的DTC部分就【直接】可以跑NanoPC-T4 参考资料&#xff1a; http://www.friendlyelec.com.cn/agent.asp http://www.friendlyelec.com.c…