【MySQL进阶之路 | 基础篇】MySQL新特性 : 窗口函数

1. 前言

(1). MySQL8开始支持窗口函数. 其作用类似于在查询中对数据进行分组(GROUP BY),不同的是,分组操作会把分组的结果聚合成一条记录. 而窗口函数是将结果置于每一条数据记录中.

(2). 窗口函数还可以分为静态窗口函数和动态窗口函数.

  • 静态窗口函数的窗口大小是固定的,不会因为记录的不同而不同.
  • 动态窗口的窗口大小会随着记录的不同而变化.

(3). 窗口函数在整体上还可以分为序号函数,分布函数,前后函数,首尾函数和其他函数.

02b4204608884d49ba376024ada2c647.png

2. 窗口函数

(1). 语法结构

函数 OVER([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC])
  • OVER关键字指定窗口的范围. 如果可以省略后面的括号里的内容,则窗口包含WHERE子句符合条件的所有记录. 窗口函数会对于这些记录进行计算. 如果括号内的内容不为空,可以使用如下语法设置窗口.
  • 窗口名. 可以为窗口用AS关键字设置一个别名.
  • PARTITION BY : 分区,指定窗口函数按照哪些字段进行分区. 分区后,窗口函数在每个分区中分别计算.
  • ORDER BY : 指定窗口函数按照哪些字段进行排序. 执行排序操作使窗口函数按照排序后的数据记录的顺序编号.
  • FRAME : 为分区中的某个子集定义规则,可以用来作为滑动窗口使用.

(2). 准备工作

CREATE DATABASE mydbms4;

USE mydbms4;

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');

3. 序号函数

(1). ROW_NUMBER()函数

ROW_NUMBER函数能对数据的序号进行顺序显示.

SELECT ROW_NUMBER() OVER (PARTITION BY category_id 
ORDER BY price DESC) AS row_num, 
category,name,price,stock,upper_time
FROM goods;


1	女装/女士精品	呢绒外套	399.90	1200	2020-11-10 00:00:00
2	女装/女士精品	卫衣	89.90	1500	2020-11-10 00:00:00
3	女装/女士精品	牛仔裤	89.90	3500	2020-11-10 00:00:00
4	女装/女士精品	连衣裙	79.90	2500	2020-11-10 00:00:00
5	女装/女士精品	T恤	39.90	1000	2020-11-10 00:00:00
6	女装/女士精品	百褶裙	29.90	500	2020-11-10 00:00:00
1	户外运动	山地自行车	1399.90	2500	2020-11-10 00:00:00
2	户外运动	运动外套	799.90	500	2020-11-10 00:00:00
3	户外运动	滑板	499.90	1200	2020-11-10 00:00:00
4	户外运动	自行车	399.90	1000	2020-11-10 00:00:00
5	户外运动	骑行装备	399.90	3500	2020-11-10 00:00:00
6	户外运动	登山杖	59.90	1500	2020-11-10 00:00:00
  • 由查询结果可以知道,依据category_id将表中记录分为两个分区,窗口函数分别在每个分区进行计算. 并对表中记录进行顺序显示.

(2). RANK()函数

使用RANK函数能对序号进行并列排序,并且会跳过重复序号. 如1,1,3.

SELECT RANK() OVER (PARTITION BY category_id 
ORDER BY price DESC) AS row_num, 
category,name,price,stock,upper_time
FROM goods;

93c62902194142fd89df014e15a555ea.png

(3). DENSE_RANK()函数

使用该函数进行并列排序,并且不会跳过重复序号. 比如1,1,2.

SELECT DENSE_RANK() OVER (PARTITION BY category_id 
ORDER BY price DESC) AS row_num, 
category,name,price,stock,upper_time
FROM goods;

68f4684e1df249c1a67efbeff91129e5.png

4. 分布函数

(1). PERCENT_RANK()函数

该函数是百分比函数,其按照(rank-1)/(rows-1)进行计算.

rank是RANK()函数计算的序号,row是当前窗口的总记录数.

SELECT PERCENT_RANK() OVER (PARTITION BY category_id 
ORDER BY price DESC) AS row_num, 
category,name,price,stock,upper_time
FROM goods;

97856f55e30a4eb5992a4134381157b9.png

(2). CUME_DIST()函数

CUME_DIST函数主要用于查询小于或等于某个值的比例.

查询当前表<或=当前价格的比例.

SELECT CUME_DIST() OVER (PARTITION BY category_id 
ORDER BY price) AS row_num, 
category,name,price,stock,upper_time
FROM goods;

1789f41dcd8542e18e790af5eb0ab3d7.png

5. 前后函数

(1). LAG(expr,n)函数

该函数返回当前行的前n个行的expr的值.

SELECT LAG(price, 1) OVER (PARTITION BY category_id 
ORDER BY price) AS row_num, 
category,name,price,stock,upper_time
FROM goods;

7d66079a3bff487c8596fe94fb97fcad.png

​(2). LEAD(expr,n)函数

该函数返回当前行的后n个行的expr的值.

​6. 首尾函数

(1). FIRST_VALUE(expr)

该函数返回expr字段第一个expr的值.

SELECT FIRST_VALUE(price) OVER (PARTITION BY category_id 
ORDER BY price) AS row_num, 
category,name,price,stock,upper_time
FROM goods;

70f5b77348f74c5b846c67d94c16599b.png

(2). LAST_VALUE(expr)函数

该函数用来返回expr字段最后一个expr的值.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

秋招突击——算法——模板题——区间DP(1)——加分二叉树

文章目录 题目描述思路分析实现代码分析总结 题目描述 思路分析 实现代码 不过我的代码写的真的不够简洁&#xff0c;逻辑不够清晰&#xff0c;后续多练练吧。 // 组合数问题 #include <iostream> #include <algorithm>using namespace std;const int N 35; int…

聚星宇学电商:现在开一家抖音网店真的好做吗

在数字经济的浪潮中&#xff0c;抖音以其强大的流量优势成为众多创业者眼中的“香饽饽”。然而&#xff0c;开一家抖音网店是否真的好做?这个问题值得我们深入探讨。 不可否认的是&#xff0c;抖音平台汇聚了海量的用户基础和丰富的社交属性&#xff0c;为商家提供了一个广阔的…

【Linux】Centos7安装RabbitMQ

【Linux】Centos7安装RabbitMQ 下载 从 rabbitmq 的 GitHub 仓库下载 https://github.com/rabbitmq/rabbitmq-server/releases rabbitmq 是 erlang 语言编写的&#xff0c;需要先安装 erlang https://github.com/rabbitmq/erlang-rpm/releases 安装 使用rz命令上传 erlang 和 …

【linux】yumvim工具理解使用

目录 Linux 软件包管理器 yum 关于 rzsz 注意事项 查看软件包 Linux开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 vim末行模式命令集 简单vim配置 配置文件的位置 sudo提权 Linux 软件包管理器 yum 1.yum是什么&#xff1…

Jenkins动态slave

目录 所需环境 安装nfs 部署Jenkins 安装插件 ​编辑添加凭据 配置动态slave 连接kubernetes集群 ​编辑配置Jenkins地址 ​编辑配置Pod模板 ​编辑确认代理端口 创建任务测试 在当今软件开发生命周期中&#xff0c;持续集成/持续部署&#xff08;CI/CD&#xff09;已…

软件测试面试会问哪些问题?(二)

三、测试理论论 3.1 你们原来项目的测试流程是怎么样的 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c;我们会…

es数据备份和迁移Elasticsearch

Elasticsearch数据备份与恢复 前提 # 注意&#xff1a; 1.在进行本地备份时使用--type需要备份索引和数据&#xff08;mapping,data&#xff09; 2.在将数据备份到另外一台ES节点时需要比本地备份多备份一种数据类型&#xff08;analyzer,mapping,data,template&#xff09; …

计算机缺失ffmpeg.dll如何修复,五种详细的修复教程分享

当你在使用电脑过程中&#xff0c;突然遇到系统或软件弹出提示信息&#xff0c;告知“ffmpeg.dll文件丢失”怎么办&#xff1f;当电脑提示ffmpeg.dll丢失时&#xff0c;可能会导致一些应用程序无法正常运行或出现错误提示。下面我将介绍5种解决电脑提示ffmpeg.dll丢失的方法。 …

142.栈和队列:用栈实现队列(力扣)

题目描述 代码解决 class MyQueue { public:stack<int> stIn; // 输入栈&#xff0c;用于push操作stack<int> stOut; // 输出栈&#xff0c;用于pop和peek操作MyQueue() {}void push(int x) {stIn.push(x); // 将元素压入输入栈}int pop() {// 如果输出栈为空&…

16. Elasticsearch面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 什么是Elasticsearch? Elasticsearch是一个基于Lucene的搜索引擎。它提供了具有HTTP Web界面和无架构JSON文档的分布式&#xff0c;多租户能力的全文搜索引擎。 Elasticsearch是用Java开发的&#xff0c;根据Apache许可条款作为开源发布…

Docker镜像源自动测试镜像速度,并选择速度最快的镜像

国内执行如下代码 bash <(curl -sSL https://gitee.com/xjxjin/scripts/raw/main/check_docker_registry.sh)国外执行如下代码 bash <(curl -sSL https://github.com/xjxjin/scripts/raw/main/check_docker_registry.sh)如果有老铁有比较不错的镜像源&#xff0c;可以提…

局域网传文件怎么操作?轻松实现文件共享!

在现代的办公和生活中&#xff0c;局域网传文件已经成为一种非常常见和方便的方式&#xff0c;可以快速、安全地在局域网内进行文件传输。无需依赖互联网&#xff0c;局域网传文件可以帮助团队成员之间共享文件、备份数据、进行协作等。本文将介绍三种常见的方法&#xff0c;帮…

word-形状绘制、smartart、visio

一、人员架构图绘制 小技巧&#xff1a; 1、ctrlshift水平复制 2、点击图形&#xff0c;右键设置为默认形状 3、插入-形状-右键-锁定绘图模式&#xff0c;按esc退出状态 4、插入-形状-新建绘图画布&#xff0c;代替组合问题 画布中存在锚点&#xff0c;便于直线连接 二、s…

掌握一个面试小心机,就业离你只差这一步!

马上进6月份&#xff0c;大家是已经在工作岗位上了&#xff0c;还是正在面试呀&#xff01;不知道大家在面试过程中有没有遇到这样的问题&#xff0c;面试完几家公司之后进行总结&#xff0c;还是不知道自己为什么被pass掉&#xff0c;今天小编带大家搞清测试岗位面试的底层逻辑…

Centos7.9安装openldap和phpldapadmin

文章目录 一、背景二、正文2.1 安装openldap2.2 修改openldap配置2.3 安装phpldapadmin2.4 登录phpldapadmin界面 三、安装途中可能碰到的报错错误场景1&#xff1a;执行步骤“安装openldap”途中碰到的错误&#xff0c;即执行命令&#xff1a;systemctl start slapd报错错误场…

【Day7:JAVA面向对象的初级使用】

目录 1、类和对象1.1 类的介绍1.2 类和对象的关系1.3 类的组成 2、对象内存图2.1 单个对象内存图2.2 两个对象内存图2.3 两个引用指向相同内存图 3、成员变量和局部变量3.1 成员变量和局部变量的区别 4、this关键字4.1 this可以解决的问题4.2 this介绍4.3 this内存图4.4 this总…

Python 新手最容易踩的坑

Python新手最容易踩的坑 缩进错误忘记引入模块使用未定义的变量不理解变量作用域字符串格式化错误乱用关键字多余的符号本期图书推荐&#xff1a;Python算法小讲堂---39个算法案例带你玩转Python内容简介获取方式 在学习 Python 的过程中&#xff0c;新手往往会遇到一些常见的陷…

【四、性能测试】Linux stress 压力模拟测试工具

在做 CPU 问题解析之前&#xff0c;需要先了解一下压力模拟工具&#xff0c;可以将 CPU、MEM、IO 等进行压力模拟&#xff0c;可以在模拟压力的过程中进行问题解析 一、STRESS 模拟对CPU、Memory、IO、磁盘进行压力测试。可以使用 stress 工具&#xff0c;它是专门针对 linux…

部署yum仓库及NFS共享

yum概述 yum 1&#xff09;基于RPM包构建的软件更新机制 2&#xff09;可以自动解决依赖关系 3&#xff09;所有软件包由集中的YUM软件仓库提供 准备安装源 一键安装软件包的工具&#xff1a; RHEL、CentOS yum dnf Ubuntu、Debian apt apt-get 好处&#xff1a;…

GitKraken克隆Git仓库

克隆Git仓库 修改本地仓库 在此新增了一个test.txt文件 GitKraken提醒有一处改变 暂存&#xff08;Stage&#xff09;该文件&#xff0c;添加描述后提交修改&#xff1a; 修改成功&#xff1a;