【MySQL】窗口函数

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 窗口函数对一些常见的需求还是有很大帮助的,今天总结一下常见的用法。

MySQL系列文章


什么是窗口函数

窗口函数可以进行排序,生成序列号等一般的聚合函数无法实现的高级操作。窗口函数也称为OLAP函数,意思是对数据库数据进行实时分析处理。


作用类似于在查询中对数据进行分组,不同的是,group分组操作会把分组的结果聚合成一条记录,而窗口函数是结果分组然后分别处理。


窗口函数是对 where 或者 group by 子句处理后的结果进行操作,所以窗口函数原则上只能写在 select 子句中


语法

select 窗口函数 over (partition by 用于分组的列名, order by 用于排序的列名)


常见窗口函数

名称

描述

CUME_DIST()

累积分配值

DENSE_RANK()

当前行在其分区中的排名,稠密排序

FIRST_VALUE()

指定区间范围内的第一行的值

LAG()

取排在当前行之前的值

LAST_VALUE()

指定区间范围内的最后一行的值

LEAD()

取排在当前行之后的值

NTH_VALUE()

指定区间范围内第N行的值

NTILE()

将数据分到N个桶,当前行所在的桶号

PERCENT_RANK()

排名值的百分比

RANK()

当前行在其分区中的排名,稀疏排序

ROW_NUMBER()

分区内当前行的行号


举例表

CREATETABLE 成绩单 ( 学号 VARCHAR(8), 姓名 VARCHAR(8), 科目 VARCHAR(8), 得分 INT) ENGINE = INNODB DEFAULT CHARSET = utf8;INSERTINTO 成绩单
VALUES('1000','小明','语文',112),('1000','小明','数学',120),('1000','小明','英语',92),('1001','云朵','语文',112),('1001','云朵','数学',118),('1001','云朵','英语',99),('1002','库里','语文',101),('1002','库里','数学',111),('1002','库里','英语',90),('1003','才子','语文',112),('1003','才子','数学',120),('1003','才子','英语',112),('1004','小华','语文',112),('1004','小华','数学',112),('1004','小华','英语',112),('1005','强森','语文',92),('1005','强森','数学',120),('1005','强森','英语',92);


排名函数

  1. RANK(),根据排序字段为每个分组中的每一行分配一个序号。排名值相同时,序号相同,但序号并列后中存在间隙。(1,1,1,4,5这种)
  2. DENSE_RANK(),根据排序字段为每个分组中的每一行分配一个序号。排名值相同时,序号相同,序号中没有间隙(1,1,1,2,3这种)
  3. ROW_NUMBER(),为表中的每一行分配一个序号,可以指定分组(也可以不指定)及排序字段(连续且不重复)


三个函数都是排名函数,按科目分组计算每科排名

SELECT*, RANK() OVER ( PARTITION BY 科目 ORDERBY 得分 DESC)AS RANK_排名 , DENSE_RANK() OVER ( PARTITION BY 科目 ORDERBY 得分 DESC)AS DENSE_RANK_排名 , ROW_NUMBER() OVER ( PARTITION BY 科目 ORDERBY 得分 DESC)AS ROW_NUMBER_排名
FROM 成绩单

image.png


TOPN问题

求各个科目排名第一的学生及得分

SELECT*FROM(SELECT*, row_number() OVER ( PARTITION BY 科目 ORDERBY 得分 DESC)AS rank_row FROM 成绩单 ) a 
WHERE rank_row =1;

通用公式:

select*from(select*, row_number() over 
(partition by 要分组的列名 
orderby 要排序的列名 desc    )as ranking from 表明)
as a where ranking<=N;


还有很多其他的用法,这里只是提一个最常见的场景

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
SQL 关系型数据库 MySQL
MySQL8 窗口函数
MySQL 8 引入了窗口函数,这是一种强大的分析工具,可以在查询结果集中执行计算而无需将数据分组到多个输出行中。本文介绍了窗口函数的基本概念和使用方法,并通过几个实际案例展示了如何使用窗口函数进行成绩和排名统计、销售数据分析等操作。
MySQL8 窗口函数
|
6月前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
122 0
|
5月前
|
关系型数据库 MySQL 数据挖掘
MySQL窗口函数:原理和使用
MySQL窗口函数:原理和使用
|
5月前
|
关系型数据库 MySQL 数据挖掘
MySQL窗口函数详解(概念+练习+实战)
MySQL窗口函数详解(概念+练习+实战)
981 1
|
5月前
|
关系型数据库 MySQL
MYSQL 窗口函数
MYSQL 窗口函数
|
5月前
|
关系型数据库 MySQL 数据挖掘
MySQL 8窗口函数详解:高效数据处理的必备技能
MySQL 8窗口函数详解:高效数据处理的必备技能
209 3
|
5月前
|
关系型数据库 MySQL Serverless
【随手记】MySQL窗口函数计算累加和
【随手记】MySQL窗口函数计算累加和
415 0
|
6月前
|
SQL Oracle 关系型数据库
MySQL窗口函数怎么用
这段内容介绍了如何使用窗口函数(Window Function)在 MySQL 8.x 中进行更高效、简洁的数据分析和计算。窗口函数允许我们在查询结果集的特定窗口(或分区)内执行计算,如聚合、排序和行号生成。文章以一个复杂的 SQL 查询作为示例,展示了如何使用窗口函数简化这个计算排名的过程。
|
关系型数据库 MySQL
MySQL8.0新特性之窗口函数学习
MySQL8.0新特性之窗口函数学习
153 0
|
SQL 数据挖掘 关系型数据库
MySQL8新特性窗口函数详解
MySQL8新特性窗口函数详解
254 0