mysql的窗口函数

一、窗口函数

1.1 什么是窗口函数

  窗口函数,也叫OLAP函数(Online Analytical Processing,联机分析处理),可以对数据库进行实时分析处理,窗口函数的基本语法如下:

<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)

  <窗口函数>的位置,可以放以下两种函数:
专用窗口函数:rank,dense_rank,row_number等;
聚合函数:sum,avg,count,max,min等。
因为窗口函数是对where或者group by子句处理后的结果进行操作,原则上窗口函数只能出现在select子句中。

1.2 窗口函数作用

  在数据库应用中,经常会遇到分组排名的数据分析需求,例如下面的业务需求:
排名问题:每个部门按业绩来排名;
topN问题:找出每个部门排名前N的员工信息;

二、数据准备

2.1 表结构

CREATE TABLE `stu_score` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `stu_no` varchar(10) NOT NULL COMMENT '学号',
  `stu_name` varchar(10) NOT NULL COMMENT '姓名',
  `cour_no` varchar(10) NOT NULL COMMENT '课程号',
  `cour_name` varchar(20) NOT NULL COMMENT '课程名',
  `score` int NOT NULL COMMENT '分数',
  PRIMARY KEY (`id`)
) COMMENT='学生课程成绩表';

CREATE TABLE `order_form` (
  `order_id` int NOT NULL AUTO_INCREMENT,
  `order_no` varchar(10) DEFAULT NULL COMMENT '订单编号',
  `order_comment` varchar(10) DEFAULT NULL COMMENT '订单内容',
  `order_dt` varchar(10) DEFAULT NULL COMMENT '订单日期',
  PRIMARY KEY (`order_id`)
) COMMENT='订单表';

2.2 测试数据

INSERT INTO stu_score
(stu_no, stu_name, cour_no, cour_name, score) 
VALUES
('lihua', '张三', 'match', '数学', 99),
('lihua', '张三', 'English', '英语', 99),
('lihua', '张三', 'physics', '物理', 99),
('sunlei', '李四', 'match', '数学', 95),
('sunlei', '李四', 'English', '英语', 40),
('sunlei', '李四', 'physics', '物理', 88),
('wangping', '王五', 'match', '数学', 67),
('wangping', '王五', 'English', '英语', 78),
('wangping', '王五', 'physics', '物理', 61),
('zhangfu', '张大强', 'match', '数学', 95),
('zhangfu', '张大强', 'English', '英语', 87),
('zhangfu', '张大强', 'physics', '物理', 61),
('liuyishou', '刘阳', 'match', '数学', 91),
('liuyishou', '刘阳', 'English', '英语', 68),
('liuyishou', '刘阳', 'physics', '物理', 70),
('chenyang', '白展堂','match', '数学', 77),
('chenyang', '白展堂', 'English', '英语', 78),
('chenyang', '白展堂', 'physics', '物理', 99);

INSERT INTO order_form(order_no, order_comment, order_dt)
VALUES 
('001', '买人', '2024-03-01'),
('002', '买砖', '2024-03-01'),
('003', '买电', '2024-03-01'),
('004', '买水', '2024-03-02'),
('005', '买线', '2024-03-03'),
('006', '买酒', '2024-03-03'),
('007', '买衣', '2024-03-04'),
('008', '买帽', '2024-03-04'),
('009', '买裤', '2024-03-05'),
('010', '买房', '2024-03-05'),
('011', '买车', '2024-03-06'),
('012', '买肉', '2024-03-07'),
('013', '买蛋', '2024-03-08'),
('014', '买吃', '2024-03-08'),
('011', '买鱼', '2024-03-08'),
('012', '买人', '2024-03-08'),
('013', '买茶', '2024-03-08'),
('014', '买琴', '2024-03-09'),
('015', '买棋', '2024-03-09'),
('016', '买书', '2024-03-09'),
('017', '买画', '2024-03-09'),
('018', '买笔', '2024-03-10'),
('019', '买猪', '2024-03-10'),
('020', '买羊', '2024-03-10'),
('021', '买牛', '2024-03-10'),
('022', '买鹅', '2024-03-10'),
('023', '买鸭', '2024-03-10'),
('024', '买鸡', '2024-03-10');

三、函数详解

3.1 序号函数

3.1.1 rank():返回数据集中每个值的排名,排名是根据当前行之前的行数加1,不包含当前行,该函数排序的关联值可能产生顺序上的空隙。例如,查看各科成绩的排名信息,如下:

SELECT
	cour_no,cour_name,
	RANK() OVER(PARTITION BY cour_no ORDER BY score DESC) AS paiming,
	stu_no,stu_name,score
FROM stu_score

  结果如下图所示:
在这里插入图片描述
如上图,顺序间隙是指在出现相同分数时,相同分数的排名相同,但是下一个名次的计数会越过排名相同造成的数量。

3.1.2 dense_rank():返回一组数值中每个数值的排名,该函数排序时不会产生顺序上的空隙。如上例换成使用dense_rank(),如下:

SELECT 
    cour_no,cour_name,
    DENSE_RANK()  OVER(PARTITION BY cour_no ORDER BY score DESC) AS paiming,
    stu_no ,stu_name ,score 
FROM stu_score 

在这里插入图片描述
排名之间是没有数据间隔的。

3.1.3 row_number():为每行数据返回一个唯一的顺序的行号,从1开始,根据行在窗口分区内的顺序。如下:

SELECT
cour_no,cour_name,
row_number() OVER(PARTITION BY cour_no ORDER BY score DESC) AS paiming,
stu_no,stu_name,score
FROM stu_score

在这里插入图片描述

3.2 分布函数

  cume_dist():表示当前行及小于当前行在窗口分区总行数中的占比。例如在订单数据中,分别统计每一天的累计订单总数占历史订单的百分比,则可以使用cume_dist()函数,如下分析:
  由测试数据可知,订单总数共28个,历史订单累计数量从2024-03-01到2024-03-10分别为:3,4,6,8,10,11,12,17,21,28,我们最终需要得到的是这10个数字与28的比。

SELECT 
    order_id ,order_no ,order_comment ,order_dt ,
    CUME_DIST() OVER(ORDER BY order_dt ASC) AS per
FROM order_form ;

在这里插入图片描述
  以上是全量累计数据的比,所以在窗口函数中不需要按字段值进行分区,直接排序即可,per的列值给出了order_dt的值对应的百分比,所以只需要在该结果集上进行加工,就能获取累计订单占总订单的百分比,使用如下SQL:

SELECT
order_dt,per
FROM (
	SELECT
	order_id,order_no,order_comment,order_dt
	,CUME_DIST() OVER(ORDER BY order_dt ASC) AS per
	FROM order_form ) AS tmp
GROUP BY order_dt, per;

在这里插入图片描述

3.3 偏移函数

  lag():向上偏移,返回当前字段前n行的数据;
  lead():向下偏移,返回当前字段后n行的数据;
  偏移函数通常用于取时间间隔、做记录差值、取某数据前后N行等形式的数据处理需求,该函数可接受三个参数,第一个参数是表达式或者字段(即填充的值),第二个参数是偏移量,第三个参数是控制赋值(即当第一个参数按照第二个参数的偏移量无法确定填充值时,按何规则填充)。

查询每一笔订单的前第1笔订单的内容,没有前第2比订单的用汉字“无”填充,如下SQL:

select *, lag(order_comment, 1, "无") over() as per
from order_form

select *, lead(order_comment, 1, "无") over() as per
from order_form

在这里插入图片描述
在这里插入图片描述

3.4 头尾函数

  头尾函数包含first_value()和last_value(),只选择分组排序中的第一条数据和最后一条数据,求每个学生的课程成绩与最高成绩之间的差距,使用SQL如下:

select *,
first_value(score) over(partition by cour_no order by score desc) as max_score,
(first_value(score) over(partition by cour_no order by score desc) - score) as first_diff
from stu_score

在这里插入图片描述

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

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

相关文章

Web前端开发

1. 介绍 本文将覆盖Web前端开发的方方面面&#xff0c;包括HTML、CSS、JavaScript三大基础知识&#xff0c;vue3框架以及项目实战&#xff0c;帮助读者从零开始掌握前端开发。 2. Web前端开发基础 2.1 HTML5 2.1.1 什么是HTML5 HTML&#xff08;HyperText Markup Language…

【深海王国】初中生也能画的电路板?手把手教你制作第一个PCB电路板(2)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛苦工作的你今天也辛苦啦(/≧ω) 今天大都督将继续为大家带来系列——初中生也能画的电路板&#xff0c;帮你一周内快速入门PCB设计&#xff0c;手把手教你从元器件库添加、电路原理图绘制、PCB布局设计…

SparkStreaming--scala

文章目录 第1关&#xff1a;QueueStream代码 第2关&#xff1a;File Streams代码 第1关&#xff1a;QueueStream 任务描述 本关任务&#xff1a;编写一个清洗QueueStream数据的SparkStreaming程序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.如何使用S…

【07】分布式事务解决方案

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成。事务应该具有ACID四个特性&#xff1a;原子性、一致性、隔离性、持久性。任何事务机制在实现时&#xff0c;都应该考虑事务…

mac生成.dmg压缩镜像文件

mac生成.dmg压缩镜像文件 背景准备内容步骤1&#xff0c;找一个文件夹2&#xff0c;制作application替身1&#xff0c;终端方式2&#xff0c;黄金右手方式 3&#xff0c;.app文件放入文件夹4&#xff0c;制作.dmg压缩镜像文件5&#xff0c;安装.dmg 总结 背景 为绕开App Store…

纯css实现语音播报动画效果

先来看看效果图 黑色以下代码 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAYCAYAAAAF6fiUAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAO8SURBVGiB1ZlPaBxVHMe/v7fbkmUZErRs9/1moUtYBBfxklZR8aYg5KAgvcT25MFDvUhPTaGnHoKIlOpJ0VsPUvAgKNjSS0EPAVGKya…

防火墙综合实验之NAT和智能选路

目录 前言&#xff1a; 一、实验题目 二、实验操作 需求一 需求二 需求三 需求四、需求五 需求六 需求七 ​编辑 需求八 需求九 需求十 需求十一 三、需求测试 前言&#xff1a; 本篇文章是延续上一篇文章&#xff0c;简单来说就是防火墙实验的完善和延续&#…

Zabbix6.0监控Freeswitch状态

一、前提环境说明 1、最终实现Freeswitch监控指标信息&#xff1a; 2、环境需求&#xff1a; &#xff08;1&#xff09;需要使用Zabbix6.0及以上 &#xff08;2&#xff09;需要使用zabbix_agent2 二、实现步骤 1、zabbix_agent2添加监控键值 cat /etc/zabbix/conf.d/fr…

唯众物联网综合实训台 物联网实验室建设方案

物联网综合实训装置 物联网工程应用综合实训台是我公司针对职业院校物联网行业综合技能型人才培养&#xff0c;综合运用传感器技术、RFID技术、接口控制技术、无线传感网技术、Android应用开发等&#xff0c;配合实训台上的433M无线通信设备、ZigBee节点、射频设备、控制设备、…

CoT-SC论文速读

1.论文速读 本文提出了一个重要的Decoder策略为&#xff1a;“Self-Consistency”,并将其用在CoT的Prompt工作中。 该策略作用&#xff1a;让LLM在处理复杂问题时&#xff0c;让他尝试多个推理路径&#xff0c;每一个推理路径都是一次CoT&#xff08;Chain of Thought&#x…

解决回溯算法之切割问题(leetcode--分割回文串)

文章目录 1.问题描述2.做题思路(关键是画出对于的二叉树图)3.代码实现 1.问题描述 2.做题思路(关键是画出对于的二叉树图) 1.思考从起始串的分割方案, 有a ,aa, aab三种方式 2.————————————剩余ab,b,空&#xff08;接下来对ab,b同样的方式进行分割&#xff09; 3.…

【Linux】centos7安装PHP7.4报错:libzip版本过低

问题描述 configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0) were not met: checking for libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0... no configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzi…

星辰计划02-独特视角的spring动态代理

承接上一文 动态代理 &#xff0c;这里探究spring 动态代理 会话1&#xff1a;spring动态代理 quick start &#x1f467;哥哥&#xff0c;哥哥&#xff0c;spring 怎么去搞动态代理的呢&#x1f468; 来来来&#xff0c;听我细细来说 quick start通过Spring的 ProxyFactory…

【高中数学/幂函数】比较a=2^0.3,b=3^0.2,c=7^0.1的大小

【问题】 比较a2^0.3,b3^0.2,c7^0.1的大小 【解答】 a2^0.32^3/10(2^3)^1/108^1/10 b3^0.23^2/10(3^2)^1/109^1/10 c7^0.17^1/10 由于yx^1/10在x正半轴是增函数&#xff0c;底数大的得数就大。 因为9>8>7,所以b>a>c 【图像】 在图像上绘出曲线yx^1/10&…

C++初阶:类和对象(二)

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注…

报文对比工具

如果有报文对比需求&#xff0c;可以通过以下步骤实现&#xff1a; ①通过在线 XML排序、压缩、格式化 网站 排序后格式化数据 http://www.bejson.com/otherformat/xmlsort/ 访问速度快&#xff0c;操作直观&#xff0c; 1.原始xml数据 2.排序 3.格式化 ②N比对数据是否一…

哥德巴赫猜想c++

方法一 #include<bits/stdc.h> using namespace std; //定义函数&#xff0c;判断素数 bool sushu(int n){bool rtrue;//先假设是素数&#xff0c;即真//循环因子范围&#xff0c;找到一个因子就不是素数for(int i2;i<sqrt(n);i){//判断2~n的根号是否素数if(n%i0){//…

翁恺-C语言程序设计-05-3. 求a的连续和

05-3. 求a的连续和 输入两个整数a和n&#xff0c;a的范围是[0,9]&#xff0c;n的范围是[1,8]&#xff0c;求数列之和S aaaaaa…aaa…a&#xff08;n个a&#xff09;。如a为2、n为8时输出的是222222…22222222的和。 输入格式&#xff1a; 输入在一行中给出两个整数&#xf…

Hdfs3.x新特性详解

作者&#xff1a;九月 HDFS Disk Balancer(磁盘均衡器) HDFS Disk Balancer与HDFS Balancer的区别 两者都是实现负载均衡功能。 HDFS Balancer是之前Hadoop2.x中本身存在的&#xff0c;主要是多个DataNode节点之间的数据的平衡。 HDFS Disk Balancer是Hadoop3中新出现的&…

融云:换头像=换人设?社交应用中隐秘而重要的「用户信息管理」

当代年轻人失眠三大原因&#xff0c;最近新上的《喜人奇妙夜》帮你找到了—— 基金绿了、吵架输了、前任头像换了。 当你半夜翻看前任的社交账号&#xff0c;一场盛大的失眠就开始了&#xff0c;就算古希腊掌柜睡眠的神躺你旁边也不好使。即便 Ta 没有更新内容&#xff0c;昵…