【MySQL】窗口函数

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 窗口函数对一些常见的需求还是有很大帮助的,今天总结一下常见的用法。

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;


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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 关系型数据库 MySQL
|
7天前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
|
6天前
|
SQL Oracle 关系型数据库
MySQL窗口函数怎么用
这段内容介绍了如何使用窗口函数(Window Function)在 MySQL 8.x 中进行更高效、简洁的数据分析和计算。窗口函数允许我们在查询结果集的特定窗口(或分区)内执行计算,如聚合、排序和行号生成。文章以一个复杂的 SQL 查询作为示例,展示了如何使用窗口函数简化这个计算排名的过程。
|
6月前
|
关系型数据库 MySQL
MySQL8.0新特性之窗口函数学习
MySQL8.0新特性之窗口函数学习
86 0
|
11月前
|
SQL 数据挖掘 关系型数据库
MySQL8新特性窗口函数详解
MySQL8新特性窗口函数详解
228 0
Mysql8.0习题系列(八):窗口函数(一篇学会rank、dense_rank、row_number使用,超详细~)
Mysql8.0习题系列(八):窗口函数(一篇学会rank、dense_rank、row_number使用,超详细~)
|
SQL 存储 关系型数据库
Mysql数据库基础第八章:窗口函数和公用表表达式(CTE)
# 1.窗口函数 MySQL从8.0版本开始支持窗口函数。窗口函数的作用类似于在查询中对数据进行分组,不同的是,分组操作会把分组的结果聚合成一条记录,而窗口函数是将结果置于每一条数据记录中。
Mysql数据库基础第八章:窗口函数和公用表表达式(CTE)
|
关系型数据库 MySQL
【MySQL】数据库函数通关教程下篇(窗口函数专题)(下)
文章目录 写在前面 6 窗口函数 6.1 窗口函数概述 6.2 序号函数 6.2.1 ROW_NUMBER() 6.2.2 RANK() 6.2.3 DENSE_RANK() 6.3 开窗聚合函数 6.4 分布函数 6.4.1 CUME_DIST() 6.4.2 PERCENT_RANK() 6.5 前后函数-LAG与LEAD 6.6 头尾函数 写在最后
【MySQL】数据库函数通关教程下篇(窗口函数专题)(下)
|
SQL Oracle 关系型数据库
【MySQL】数据库函数通关教程下篇(窗口函数专题)(上)
文章目录 写在前面 6 窗口函数 6.1 窗口函数概述 6.2 序号函数 6.2.1 ROW_NUMBER() 6.2.2 RANK() 6.2.3 DENSE_RANK() 6.3 开窗聚合函数 6.4 分布函数 6.4.1 CUME_DIST() 6.4.2 PERCENT_RANK() 6.5 前后函数-LAG与LEAD 6.6 头尾函数 写在最后
【MySQL】数据库函数通关教程下篇(窗口函数专题)(上)
|
SQL 关系型数据库 MySQL
MySQL 8.0窗口函数优化SQL一例
MySQL 8.0窗口函数优化SQL一例