iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql 窗口函数
  • 617
分享到

Mysql 窗口函数

scalasparkjava 2023-09-17 21:09:39 617人浏览 薄情痞子
摘要

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

一, 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 查询 goods 数据表中每个商品分类下价格降序排列的各个商品信息。

SELECT *,ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) AS row_numFROM goods;

在这里插入图片描述

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的排序字段就是排名字段

3

在这里插入图片描述

4 使用RANK()函数获取 goods 数据表中类别为“女装/女士精品”的价格最高的4款商品信息。

// 常规思路SELECT *FROM goodsWHERE category = '女装/女士精品'ORDER BY price DESCLIMIT 4#窗口函数rank: 并列SELECT *,RANK() OVER (PARTITION BY category ORDER BY price DESC) AS top4PriceFROM goodsWHERE category = '女装/女士精品'LIMIT 4;

在这里插入图片描述

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

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

5

在这里插入图片描述

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)

在这里插入图片描述

来源地址:https://blog.csdn.net/nmsLLCSDN/article/details/123287490

您可能感兴趣的文档:

--结束END--

本文标题: Mysql 窗口函数

本文链接: https://www.lsjlt.com/news/411360.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql 窗口函数
    一, MySQl 8.0 窗口函数 窗口函数适用场景: 对分组统计结果中的每一条记录进行计算的场景下, 使用窗口函数更好, 注意, 是每一条!! 因为MySQL的普通聚合函数的结果(如 group...
    99+
    2023-09-17
    scala spark java
  • MYSQL窗口函数(Rows & Range)——滑动窗口函数用法
    语法介绍 窗口函数语法: over (partition by order by rows/range子句 ) 可以放以下两种函数: 1) 专用窗口函数,包括后面要讲到的rank, den...
    99+
    2023-09-03
    mysql 数据库
  • MySQL窗口函数(MySQL Window Functions)
           MySQL从8.0开始支持窗口函数(Window Functions),因其经常被用在数据分析的场景,窗口函数也被称为分析函数(Analytic Functions)。 目录 一、窗口函数概念 二、基础语法 ...
    99+
    2023-09-01
    数据库
  • mysql窗口函数有哪些
    本篇文章为大家展示了mysql窗口函数有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、说明可以用来实现一些新的查询方式。窗口函数像SUM()、COUNT()这样的集合函数,但不是将多行查询结...
    99+
    2023-06-15
  • MySQL窗口函数 PARTITION BY()函数介绍
    前期数据准备 # 创建数据库create database if not exists shopping charset utf8;# 选择数据库use shopping;# 创建产品表create ...
    99+
    2023-09-12
    mysql sql 数据库
  • SQL窗口函数之取值窗口函数的使用
    目录案例分析1.环比分析2.同比分析3.复合增长率4.不同产品最高和最低销售额示例表和脚本关于窗口函数的基础,请看文章SQL窗口函数 取值窗口函数可以用于返回窗口内指定位置的数据行。...
    99+
    2024-04-02
  • SQL窗口函数之排名窗口函数的使用
    目录案例分析案例使用的示例表1.环比分析2.同比分析3.复合增长率4.不同产品最高和最低销售额示例表和脚本关于窗口函数的基础,请看文章SQL窗口函数 取值窗口函数可以用于返回窗口内指...
    99+
    2024-04-02
  • MySQL 8.0窗口函数怎么运行
    今天就跟大家聊聊有关MySQL 8.0窗口函数怎么运行,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。# ROW_NUMBER() ...
    99+
    2024-04-02
  • MySQL窗口函数的具体使用
    目录一、什么是窗口函数1、怎么理解窗口?2、什么是窗口函数二、窗口函数用法1、序号函数:row_number() / rank() / dense_rank()2、分布函数:...
    99+
    2024-04-02
  • SQL窗口函数之排名窗口函数怎么使用
    这篇文章主要介绍“SQL窗口函数之排名窗口函数怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SQL窗口函数之排名窗口函数怎么使用”文章能帮助大家解决问题。取...
    99+
    2024-04-02
  • MySQL窗口函数实现榜单排名
    目录rank()dense_rank()row_number()rank()函数的模拟实现dense_rank()的模拟实现row_number的模拟实现总结相信大家在日常的开发中经常会碰到榜单类的活动需求,通常在榜单中...
    99+
    2023-04-11
    MySQL 榜单排名 MySQL 排名
  • MySQL:开窗函数
    当查询条件需要用到复杂子查询时,聚合函数操作起来非常麻烦,因此使用开窗函数能够轻松实现。 注意:在Oracle中称为分析函数。            在MySQL中称为开窗函数,使用于MySQL8.0以上版本,sql sever、hive、...
    99+
    2023-09-03
    mysql 数据库
  • MySQL 开窗函数
    目录(1)开窗函数的定义(2)开窗函数的实际应用场景结合order by关键词和limit关键词是可以解决很多的topN问题,比如从二手房数据集中查询出某个地区的最贵的10套房,从电...
    99+
    2024-04-02
  • Hive窗口函数回顾
    1.语法 1.1 基于行的窗口函数 Hive的窗口函数分为两种类型,一种是基于行的窗口函数,即将某个字段的多行限定为一个范围,对范围内的字段值进行计算,最后将形成的字段拼接在该表上。 注意:在...
    99+
    2023-10-12
    hive hadoop 数据仓库
  • 如何使用Pandas实现MySQL窗口函数
    今天小编给大家分享一下如何使用Pandas实现MySQL窗口函数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前言环境:...
    99+
    2023-07-05
  • SQL窗口函数之聚合窗口函数的使用(count,max,min,sum)
    目录案例分析1.移动平均值2.累计求和(ROW)3.累计求和(RANGE)示例表和脚本关于窗口函数的基础,请看文章SQL窗口函数 许多常见的聚合函数也可以作为窗口函数使用,包括AVG...
    99+
    2024-04-02
  • 【MySQL】数据库函数通关教程下篇(窗口函数专题)
    💁 个人主页:黄小黄的博客主页 ❤️ 支持我:👍 点赞 🌷 收藏 🤘关注 🎏 格言:一步一个脚印才能承接所谓的幸运 ...
    99+
    2023-09-02
    mysql 数据库 database 后端 数据库开发
  • 与SQL窗口函数相同
    窗口函数的目的是以声明的方式将业务报告需求转换为SQL,从而使查询性能和开发人员/业务分析师的效率得到显着提高。 我看到现实世界的报告和仪表板在使用窗口功能后从几小时到几分钟,几分钟到几秒钟。 ...
    99+
    2024-04-02
  • 什么是SQL窗口函数
    本篇内容主要讲解“什么是SQL窗口函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是SQL窗口函数”吧!窗口函数(Window Function) 是 SQL2003 标准中定义的一项新特...
    99+
    2023-06-15
  • SQL窗口函数是什么
    这篇文章主要介绍了SQL窗口函数是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。窗口函数形如:表达式 OVER (PARTITION BY 分组字段 ORDER BY 排...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作