mysql窗口函数

MySQl 8.0 窗口函数

窗口函数适用场景: 对分组统计结果中的每一条记录进行计算的场景下, 使用窗口函数更好, 注意, 是每一条!! 因为MySQL的普通聚合函数的结果(如 group by)是每一组只有一条记录!!!

可以跟Hive的对比着看: 点我, 特么的花了一晚上整理, 没想到跟Hive 的基本一致, 还不因为好久没复习博客了, 淦

注意: mysql 因为没有array数据结构, 无法像Hive一样 行列进行转换;

1.1 窗口函数分类

  • MySQL从8.0版本开始支持窗口函数。窗口函数的作用类似于在查询中对数据进行分组,不同的是,分组操作会把分组的结果聚合成一条记录,而窗口函数是将分组的结果置于每一条数据记录中
  • 窗口函数可以分为静态窗口函数动态窗口函数
    • 静态窗口函数的窗口大小是固定的, 不会因为记录的不同而不同;
    • 动态窗口函数的窗口大小会随着记录的不同而变化;

窗口函数总体上可以分为序号函数, 分布函数, 前后函数, 首尾函数和其他函数;

在这里插入图片描述

1.2 语法结构

  • 窗口函数的语法结构:
    • 函数 OVER ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]) 
    • 或者是 函数 OVER 窗口名 … WInDOW 窗口名 AS ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]) 

OVER 关键字指定窗口的范围;

  • 如果省略后面括号中的内容,则窗口会包含满足WHERE条件的所有记录,窗口函数会基于所有满足WHERE条件的记录进行计算。
  • 如果OVER关键字后面的括号不为空,则可以使用如下语法设置窗口。

PARTITION BY 子句: 指定窗口函数按照哪些字段进行分组分组后, 窗口函数可以在每个分组中分别执行;
ORDER BY 子句: 指定窗口函数按照哪些字段进行排序, 执行排序操作使窗口函数按照排序后的数据记录的顺序进行编号;
FRAME 子句: 为分区中的某个子集定义规则, 可以用来作为滑动窗口使用;


1.3 窗口函数🌰

准备表和数据:

  • 创建表:

CREATE TABLE goods(id INT PRIMARY KEY AUTO_INCREMENT,category_id INT,category VARCHAR(15),NAME VARCHAR(30),price DECIMAL(10,2),stock INT,upper_time DATETIME
);
  • 插入数据:
INSERT INTO goods(category_id,category,NAME,price,stock,upper_time)
VALUES
(1, '女装/女士精品', 'T恤', 39.90, 1000, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '连衣裙', 79.90, 2500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '卫衣', 89.90, 1500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '牛仔裤', 89.90, 3500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '百褶裙', 29.90, 500, '2020-11-10 00:00:00'),
(1, '女装/女士精品', '呢绒外套', 399.90, 1200, '2020-11-10 00:00:00'),
(2, '户外运动', '自行车', 399.90, 1000, '2020-11-10 00:00:00'),
(2, '户外运动', '山地自行车', 1399.90, 2500, '2020-11-10 00:00:00'),
(2, '户外运动', '登山杖', 59.90, 1500, '2020-11-10 00:00:00'),
(2, '户外运动', '骑行装备', 399.90, 3500, '2020-11-10 00:00:00'),
(2, '户外运动', '运动外套', 799.90, 500, '2020-11-10 00:00:00'),
(2, '户外运动', '滑板', 499.90, 1200, '2020-11-10 00:00:00');

下面针对goods表中的数据来验证每个窗口函数的功能。

1. 序号函数

序号函数是按照一定的分组规则对每一组的数据排序并创建一个序号列

1.1 row_number() - 单纯的对每一组数据编号

函数功能
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 tWHERE top3Price <= 3

在这里插入图片描述

在名称为“女装/女士精品”的商品类别中,有两款商品的价格为89.90元,分别是卫衣和牛仔裤。两款商品的序号都应该为2,而不是一个为2,另一个为3。此时,可以使用RANK()函数和DENSE_RANK()函数解决;

1.2 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;

在这里插入图片描述

1.3 dense_rank() - 排序每一组的某一字段, 同等级同序号前后也连续

函数功能
dense_rank()对序号进行并列排序, 指定字段数值相同(同一等级),则会产生相同序号记录,且产生序号间隙,

1.5

在这里插入图片描述

1.6

在这里插入图片描述

可以看到,使用DENSE_RANK()函数得出的行号为1、2、2、3,相同价格的商品序号相同,且后面的商品序号是连续的

2. 分布函数

2.1 percent_rank() - 等级值百分比, (rank - 1)/ (rows - 1)

函数功能
percent_rank()计算分区或结果集中行的百分位数排名
每行按照公式(rank-1)/ (rows-1)进行计算。其中,rank为RANK()函数产生的序号rows当前窗口(当前组)的总行数

在这里插入图片描述

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

函数功能
cume_dist()分组内<=当前rank值的行数 / 分组内总行数

在这里插入图片描述

3. 前后函数

3.1 LAG(expr, n) - 返回当前行的前n行(本组内)的expr值

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

在这里插入图片描述

3.2 LEAD(expr, n)

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

在这里插入图片描述

4. 首位函数

4.1 first_value(expr) , last_value(expr)

在这里插入图片描述

5. 其他函数

5.1 nth_value(expr, n)

在这里插入图片描述

5.2 ntile(n)

在这里插入图片描述

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

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

相关文章

ntfy Delphi 相关消息接口文档

关联文档&#xff1a; ntfy 实现消息订阅和通知&#xff08;无需注册、无需服务器&#xff0c;太好了&#xff09;_海纳老吴的博客-CSDN博客群晖 nas 自建 ntfy 通知服务&#xff08;梦寐以求&#xff09;_海纳老吴的博客-CSDN博客 目录 一、消息实体对象接口 1. 消息发布方…

【MybatisPlus】LambdaQueryWrapper和QueryWapper的区别

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

自定义 视频/音频 进度条

复制代码根据自己需求改动就可以了 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><metaname"viewport"conten…

如何保证数据传输的安全?

要确保数据传输的安全&#xff0c;您可以采取以下措施&#xff1a; 使用加密协议&#xff1a;使用安全的传输协议&#xff0c;如HTTPS(HTTP over SSL/TLS)或其他安全协议&#xff0c;以保护数据在传输过程中的安全性。加密协议可以有效防止数据被窃听或篡改。 强化身份验证&…

途乐证券-越跌越买!港股又回调,资金却坚定买入,行情何时到来?

港股重复震动。 8月14日&#xff0c;港股三大指数再次跌落&#xff0c;截至收盘&#xff0c;恒生指数跌1.58%&#xff0c;报18773.55点&#xff0c;恒生科技指数跌1.52%&#xff0c;国企指数跌1.79%。 进入8月以来&#xff0c;港股继续跌落&#xff0c;恒生指数单月跌落6.5%&a…

Collada .dae模型格式简明教程

当你从互联网下载 3D 模型时&#xff0c;可能会在格式列表中看到 .dae 格式。 它是什么&#xff1f; 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景。 1、Collada DAE概述 COLLADA是COLLAborative Design Activity&#xff08;中文&#xff1a;协作设计活动&#xff0…

vue3+vite配置vantUI主题

❓在项目中统一配置UI主题色&#xff0c;各个组件配色统一修改 vantUI按需安装 参考vantUI文档 创建vantVar.less文件夹进行样式编写 vantVar.less :root:root{//导航--van-nav-bar-height: 44px;//按钮--van-button-primary-color: #ffffff;--van-button-primary-backgr…

Python web实战之Django的AJAX支持详解

关键词&#xff1a;Web开发、Django、AJAX、前端交互、动态网页 今天和大家分享Django的AJAX支持。AJAX可实现在网页上动态加载内容、无刷新更新数据的需求。 1. AJAX简介 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在网页上实现异步通信的技术。通过…

Matlab图坐标轴数值负号改为减号(change the hyphen (-) into minus sign (−, “U+2212”))

在MATLAB中&#xff0c;坐标轴负数默认符号是 - &#xff0c;如下图所示 x 1:1:50; y sin(x); plot(x,y)可通过以下两语句将负号修改为减号&#xff1a; set(gca,defaultAxesTickLabelInterpreter,latex); yticklabels(strrep(yticklabels,-,$-$));或者 set(gca, TickLabe…

【软考】2023系统架构设计师考试

目录 1 软考资格设置 2 考试报名 3 考试准备 4 参加考试 5 考试感受 6 其他 1 软考资格设置 2 考试报名 报名网址&#xff1a;https://www.ruankao.org.cn/ 3 考试准备 4 参加考试 2023年下半年系统架构设计师考试时间为11月4、5日。 5 考试感受 6 其他 最近好像有地区…

CSS-grid布局

网格布局也叫grid布局&#xff0c;平常写样式的时候基本上都是用的flex布局。 像以下布局&#xff0c;用flex布局就可能会有有点麻烦&#xff0c;这时候用grid布局就方便的多了。 或者是照片墙 grid布局就是将容器划分为行和列&#xff0c;产生单元格&#xff0c;然后在指定的…

Labview选项卡之实现被选择选项卡工作

文章目录 前言一、使用选项卡二、实现被选择选项卡工作1、需求2、分析3、实现①、前面板②、程序框图 三、效果展示四、源码自取 前言 有些时候&#xff0c;我们做界面&#xff0c;需要好多个界面切换。如果是同一个 VI 里界面切换&#xff0c;一般都是选项卡了。切换不同选项…