| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 大数据 -> Mysql 窗口函数 -> 正文阅读 |
|
|
[大数据]Mysql 窗口函数 |
一, MySQl 8.0 窗口函数
1.1 窗口函数分类
1.2 语法结构
1.3 窗口函数🌰
下面针对goods表中的数据来验证每个窗口函数的功能。 1. 序号函数序号函数是按照一定的分组规则 1.1
|
| 函数 | 功能 |
|---|---|
| row_number() | 对数据中的序号进行顺序显示 |
[案例]
1.1 查询 goods 数据表中每个商品分类下价格降序排列的各个商品信息。
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) AS row_num
FROM goods;

1.2 查询 goods 数据表中每个商品分类下价格最高的3种商品信息。
SELECT
*
FROM
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) AS top3Price
FROM goods
) AS t
WHERE
top3Price <= 3

在名称为“女装/女士精品”的商品类别中,有两款商品的价格为89.90元,分别是卫衣和牛仔裤。两款商品的序号都应该为2,而不是一个为2,另一个为3。此时,可以使用RANK()函数和DENSE_RANK()函数解决;
rank() - 排序每一组的某一字段, 同等级同序号前后不连续| 函数 | 功能 |
|---|---|
| rank() | 对序号进行并列排序, 指定字段数值相同(同一等级),则会产生相同序号记录,且产生序号间隙, |
| 如, 1,1,3,4 而不会是 1,2,3,4(row_number的结果), 也不是 1,1,2,3,4 (dense_rank的结果) | |
rank函数没有参数,但需要指定按照那个字段进行排名,所以使用rank函数必须用order by参数,order by的排序字段就是排名字段 |
1.3

1.4 使用RANK()函数获取 goods 数据表中类别为“女装/女士精品”的价格最高的4款商品信息。
// 常规思路
SELECT *
FROM goods
WHERE category = '女装/女士精品'
ORDER BY price DESC
LIMIT 4
#窗口函数rank: 并列
SELECT
*,
RANK() OVER (PARTITION BY category ORDER BY price DESC) AS top4Price
FROM
goods
WHERE
category = '女装/女士精品'
LIMIT 4;

dense_rank() - 排序每一组的某一字段, 同等级同序号前后也连续| 函数 | 功能 |
|---|---|
| dense_rank() | 对序号进行并列排序, 指定字段数值相同(同一等级),则会产生相同序号记录,且产生序号间隙, |
1.5

1.6

可以看到,使用DENSE_RANK()函数得出的行号为1、2、2、3,相同价格的商品序号相同,且后面的商品序号是连续的
percent_rank() - 等级值百分比, (rank - 1)/ (rows - 1)| 函数 | 功能 |
|---|---|
| percent_rank() | 计算分区或结果集中行的百分位数排名 |
每行按照公式(rank-1)/ (rows-1)进行计算。其中,rank为RANK()函数产生的序号,rows为当前窗口(当前组)的总行数 |

cume_dist() - 累积分布值, <=当前rank值的行数 / 分组内总行数| 函数 | 功能 |
|---|---|
| cume_dist() | 分组内<=当前rank值的行数 / 分组内总行数 |

LAG(expr, n) - 返回当前行的前n行(本组内)的expr值| 函数 | 功能 |
|---|---|
| LAG(expr, n) | 返回当前行的前n行(本组)的expr值 |
| lag允许你在每一个分组内, 从当前行向前看n行数据 | |
| n(也叫offset)是从当前行偏移的行数,以获取值。offset必须是一个非负整数。如果offset为零,则LAG()函数计算当前行的值。如果省略 offset,则LAG()函数默认使用n=1, 向前看一个数据。 |

LEAD(expr, n)| 函数 | 功能 |
|---|---|
| LEAD(expr, n) | 返回当前行的后n行(本组)的expr值 |

first_value(expr) , last_value(expr)
nth_value(expr, n)
ntile(n)
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年10日历 | -2025/10/21 3:50:45- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |