[mysql]窗口函数
目录
窗口函数:
为何要学习窗口函数,与mysql5.7实现语句对比
现在我们介绍一下窗口函数:
函数规则
1序号函数
2分布函数
3前后函数
5其他函数
总结
窗口函数:
首先数据库的迁移是非常慢的,大家学习新特性的时候要考虑自己公司的数据库版本是不是和自己学习的吻合
为何要学习窗口函数,与mysql5.7实现语句对比
这里先建立一个表:我们看看窗口函数的使用比基础sql的实现优势在哪
CREATE TABLE sales(
id INT PRIMARY KEY AUTO_INCREMENT,
city VARCHAR(15),
county VARCHAR(15),
sales_value DECIMAL
);
INSERT INTO sales(city,county,sales_value)
VALUES
('北京','海淀',10.00),
('北京','朝阳',20.00),
('上海','黄埔',30.00),
('上海','长宁',10.00);
需求是现在计算这个网站在每个城市的销售总额、在全国的销售总额、每个区的销售额占所在城市销售
额中的比率,以及占总销售额中的比率。
创建两个个临时表,总销售额,比率,总比率(是数据库系统中一种特殊类型的表,它只在当前会话或事务期间存在,当会话结束或事务完成后会自动删除。)
CREATE TEMPORARY TABLE a -- 创建临时表
SELECT SUM(sales_value) AS sales_value -- 计算总计金额
FROM sales;
CREATE TEMPORARY TABLE b -- 创建临时表
SELECT city,SUM(sales_value) AS sales_value -- 计算城市销售合计
FROM sales;
SELECT s.city AS 城市,s.county AS 区,s.sales_value AS 区销售额,
b.sales_value AS 市销售额,s.sales_value/b.sales_value AS 市比率,
a.sales_value AS 总销售额,s.sales_value/a.sales_value AS 总比率
FROM sales s
JOIN b ON (s.city=b.city) -- 连接市统计结果临时表
JOIN a -- 连接总计金额临时表
ORDER BY s.city,s.county;
如果我们使用窗口函数可以做到一次性实现这个功能吗,答案是可以的.
需求是现在计算这个网站在每个城市的销售总额、在全国的销售总额、每个区的销售额占所在城市销售
这是我们的表.
#首先是我们的基础表格内容
SELECT sales.*
#第一个是每个城市的销售总额
,sum(sales_value) over(partition by city)
#第二个是在全国的销售总额,这里全部汇总就不需要填写参数.
,sum(sales_value) over()
#第三个是每个区的销售额
,sum(sales_value) over(partition by county)
#第四个是每个区的销售额占城市的占比
,sales_value/sum(sales_value) over(partition by city) as ‘区占比’
#第四个是每个区的销售额占全国的占比
,sales_value/sum(sales_value) over() as ‘全国占比’
#最后表来源
FROM sales
现在我们介绍一下窗口函数:
窗口函数就是group by的另一种形式,group by是分组后放在一条记录上,而窗口函数就是分类后把这些记录都保留下来在每一条记录后面
窗口函数介于单行函数和分组函数之间,单行函数不会把数据库进行一个分类,分组函数会把数据进行一个分类然后聚合为一条,窗口函数会把数据进行一个分类,
比如我想计算每个人的工资和部门最大工资的差值,那么我们就可以对部门工资进行分类,各自部门排序,然后使用窗口函数选择最后一个,,再用它减去公司的值,就可以达到差值的效果
只分类,只计算,不聚合记录,记录条数不变
函数规则
函数 OVER([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC])
函数 OVER 窗口名 … WINDOW 窗口名 AS ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC])
1序号函数
1.1row_number()函数
#查询 goods 数据表中每个商品分类下价格降序排列的各个商品信息。
#这里要根据商品分类然后进行价格降序,单行函数不能分类,聚合函数不能分类后单独排序所以使用窗口函数中的排序函数,ROW_NUMBER(这里根据实际情况决定使用rank,还是dense_rank),函数即使没有参数也要记得加括号
SELECT ROW_NUMBER() OVER(PARTITION BY category ORDER BY price) AS row_number
#保留原表需要的字段
,id, category_id, category, NAME, price, stock
FROM goods;
结果如下
#查询 goods 数据表中每个商品分类下价格最高的3种商品信息。因为这里的排序要用到新表
#这里由于需要只选择3种商品,所以我们先按商品价格进行排序,建立rownum字段之后的新表,在新表中把字段rownum进行筛选就可以.
SELECT * FROM (
#建立一个子查询表
SELECT ROW_NUMBER() OVER(PARTITION BY category ORDER BY price desc) AS
row_num,
id, category_id, category, NAME, price, stock
FROM goods) t#要给表命名,不然不能from
WHERE row_num >=3
RANK()函数,使用RANK()函数能够对序号进行并列排序,并且会跳过重复的序号,比如序号为1、1、3。
SELECT RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS#PARTITION BY
row_num,id, category_id, category, NAME, price, stock
FROM goods;
#DENSE_RANK()函数DENSE_RANK()函数对序号进行并列排序,并且不会跳过重复的序号,比如序号为1、1、2。
举例:使用DENSE_RANK()函数获取 goods 数据表中各类别的价格从高到低排序的各商品信息。
SELECT DENSE_RANK() OVER(PARTITION BY category_id ORDER BY price DESC) AS#PARTITION BY
row_num,id, category_id, category, NAME, price, stock
FROM goods;
2分布函数
2.1.PERCENT_RANK()函数
SELECT RANK() OVER w AS r,
-> PERCENT_RANK() OVER w AS pr,
-> id, category_id, category, NAME, price, stock
-> FROM goods
-> WHERE category_id = 1 WINDOW w AS (PARTITION BY category_id ORDER BY price
DESC);
+---+---
(rank - 1) / (rows - 1)
PERCENT_RANK()可以计算百分比,
第一个就是1-1除以总行数减1以此类推
2.2CUME_DUST
主要用于查询小于或等于某个值的比例。
举例:查询goods数据表中小于或等于当前价格的比例
SELECT CUME_DIST() OVER(PARTITION BY category_id ORDER BY price ASC) AS cd,
id, category, NAME, price
FROM goods;
小于各个价格的比例是多少.P(x<=p)
3前后函数
3.1LAG(expr,n)函数
LAG(expr,n)函数返回当前行的前n行的expr的值。
举例:查询goods数据表中前一个商品价格与当前商品价格的差值。
SELECT id, category, NAME, price, pre_price, price - pre_price AS diff_price
FROM (
SELECT id, category, NAME, price,LAG(price,1) OVER w AS pre_price
FROM goods
WINDOW w AS (PARTITION BY category_id ORDER BY price)) t;
2.LEAD(expr,n)函数
LEAD(expr,n)函数返回当前行的后n行的expr的值。
举例:查询goods数据表中后一个商品价格与当前商品价格的差值。
12 rows in set (0.00 sec)
SELECT id, category, NAME, behind_price, price,behind_price - price AS
diff_price
FROM(
SELECT id, category, NAME, price,LEAD(price, 1) OVER w AS behind_price
FROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price)) t;
4首尾函数
4.1FIRST_VALUE(expr)函数返回第一个expr的值。expr代表字段
SELECT id, category, NAME, price, stock,FIRST_VALUE(price) OVER w AS
first_price
FROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price);
取最小值,最大值都可以,看你要使用asc,还是desc
4.2LAST_VALUE
5其他函数
5.1NTH_VALUE(expr,n)函数
NTH_VALUE(expr,n)函数返回第n个expr的值。
举例:查询goods数据表中排名第2和第3的价格信息。
SELECT id, category, NAME, price,NTH_VALUE(price,2) OVER w AS second_price,
NTH_VALUE(price,3) OVER w AS third_price
FROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price);
NTILE(n)函数NTILE(n)函数将分区中的有序数据分为n个桶,记录桶编号。
SELECT NTILE(3) OVER w AS nt,id, category, NAME, price
-> FROM goods WINDOW w AS (PARTITION BY category_id ORDER BY price)
把数据根据你设定的顺序来分为几个组.
总结
窗口函数的特点是可以分组,而且可以在分组内排序。另外,窗口函数不会因为分组而减少原表中的行数,这对我们在原表数据的基础上进行统计和排序非常有用。
相关文章:

[mysql]窗口函数
目录 窗口函数: 为何要学习窗口函数,与mysql5.7实现语句对比 现在我们介绍一下窗口函数: 函数规则 1序号函数 2分布函数 3前后函数 5其他函数 总结 窗口函数: 首先数据库的迁移是非常慢的,大家学习新特性的时候要考虑自己公司的数据库版本是不是和自己学习的吻合 为何…...

内存四区(栈)
今天我再次学到了有趣的知识,内存四区! 内存四区分为代码区,全局区,栈区,堆区,今天我们详细来讲讲栈区! 内存四区和栈区都是用来存放数据的,而栈区存放的数据具体有两类 1.形参数…...

新零售行业时代:如何用科技驱动传统零售的转型升级
新零售行业时代:如何用科技驱动传统零售的转型升级 “在变化的世界中,唯一不变的是变化本身。” 一、传统零售的困局:当“生存”成为一场鏖战 街角的便利店老板老王,每天凌晨4点起床进货,却在月…...

长途骑行装备攻略:VELO维乐 Angel Revo坐垫伴我畅享旅途
工作忙碌了很久,终于迎来了一个难得的假期。我决定和朋友一起踏上一场长途骑行之旅,远离城市的喧嚣,去寻找那份久违的宁静与自由。这次旅行,不仅是为了旅途风景的放松,更是为了体验一场身体与心灵的挑战。而朋友推荐的…...
WebcamJS中文文档
文章目录 WebcamJS针对Chrome 47及以上版本的重要说明浏览器支持演示示例开源协议快速入门指南配置初始化拍摄照片自定义图像大小裁剪图像翻转图像(镜像模式)冻结/预览图像设置备用SWF文件位置重置(关闭)API 参考自定义事件向服务器提交图像跟踪上传进度包含在现有表单中自…...
用Python做有趣的AI项目1:用 TensorFlow 实现图像分类(识别猫、狗、汽车等)
项目目标 通过构建卷积神经网络(CNN),让模型学会识别图片中是什么物体。我们将使用 CIFAR-10 数据集,它包含 10 类:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。 🛠️ 开发环境与依赖 安装依赖&…...

微软官网Win10镜像下载快速获取ISO文件
如何从微软官网轻松下载win10镜像?win10镜像的下载方式主要包括两种: 目录 一:借助官方工具 二:直接微软官网通过浏览器进行下载。 三:实现方法与步骤: 1:利用微软官方提供的MediaCreationT…...
Python循环结构深度解析与高效应用实践
引言:循环结构在编程中的核心地位 循环结构作为程序设计的三大基本结构之一,在Python中通过while和for-in两种循环机制实现迭代操作。本文将从底层原理到高级应用,全面剖析Python循环机制的使用技巧与优化策略,助您掌握高效迭代的…...
springboot入门-controller层
在 Spring Boot 中,Controller 层是处理 HTTP 请求的核心组件,负责接收客户端请求、调用业务逻辑(Service 层)并返回响应。其核心原理基于 Spring MVC 框架,通过注解驱动的方式实现请求的路由和参数绑定。以下是 Contr…...
SpringBoot技术概述与应用实践
一、SpringBoot简介 SpringBoot是由Pivotal团队开发的一个基于Spring框架的开源框架,旨在简化Spring应用的开发与部署。它通过约定大于配置的理念,减少了配置复杂性,并通过内嵌式服务器的支持,使得开发者可以更方便地创建独立运行…...

逆向|dy|a_bogus|1.0.1.19-fix.01
2025-04-26 请求地址:aHR0cHM6Ly93d3cuZG91eWluLmNvbS91c2VyL01TNHdMakFCQUFBQV96azV6NkoyMG1YeGt0eHBnNkkzRVRKejlyMEs3d2Y2dU9EWlhvd2ttblZWRnB0dlBPMmMwN2J0WFotcVU4V3M 个人主页的视频数据 我们需要逆向这个接口,所以现在需要分析这个请求, 分析这几个数据包可以发现: 只有…...
golang的cgo的一点小心得
最后有个项目需要涉及到cgo,在这块以前用的不多, 这次略微用得深入了一点,记下来几点以备以后使用 本质上cgo去用的时候就是遵守一些ABI而已,总体而言,尽量避免复杂结构的来回传递。1 对于变长参数,只有…...
第三方测试机构如何保障软件质量并节省企业成本?
在软件行业,第三方测试机构扮演着极其重要的角色。他们提供独立且专业的测试服务,目的是为了保障软件的质量以及提升用户的使用体验。 专业独立 测试机构拥有经验丰富的测试员和严谨的测试流程。他们会对软件各项功能进行细致检验,力求不放…...

高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
目录 思路"情境 对象 问题"型 课题选题的类型有哪些呢?这要从课题题目的构成说起。通过对历年来国家社会科学基金立项项目进行分析,小编发现,课题选题类型非常丰富,但一般是围绕限定词、研究对象和研究问题进行不同的组…...

springboot项目配置nacos,指定使用环境
遇到这样一个问题,在开发、测试、生成环境之间切换的问题。 大多数的操作是通过修改spring.profiles.active来确定指向使用的环境配置文件,对应项目中需要增加对应的配置文件。 但是现在几乎所有公司都会有代码管理不管是SVN、git,这样就会涉…...

DIFY 浅尝 - DIFY + Ollama 添加模型
准备物料 Dify 本地部署 Ollama 下载 Open WebUI 好了现在,假设访问 http://localhost/apps 应该可以打开 Dify,设置用户登录后应该可以看到以下界面 打开 http://localhost:3000/, 你应该可以看到部署好的Open WebUI,并假设有下载好你感…...
高级 SQL 技巧:提升数据处理能力的实用方法
在数据驱动的时代,SQL 作为操作和管理关系型数据库的标准语言,其重要性不言而喻。基础的 SQL 语句能满足日常的数据查询需求,但在处理复杂业务逻辑、进行数据分析和优化数据库性能时,就需要掌握一些高级 SQL 技巧。这些技巧不仅能提高查询效率,还能实现复杂的数据处理任务…...

Java 异常处理全解析:从基础到自定义异常的实战指南
Java 异常处理全解析:从基础到自定义异常的实战指南 一、Java 异常体系:Error 与 Exception 的本质区别 1. 异常体系核心架构 Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许…...

开源AI智能名片链动2+1模式S2B2C商城小程序源码赋能下的社交电商创业者技能跃迁与价值重构
摘要:在移动互联网深度重构商业生态的背景下,社交电商创业者面临流量成本攀升、用户粘性不足、供应链协同低效等核心痛点。本文以“开源AI智能名片链动21模式S2B2C商城小程序源码”技术体系为研究对象,通过分析其技术架构、商业逻辑及实战案例…...
线程池(六):ThreadLocal相关知识详解
线程池(六):ThreadLocal相关知识详解 线程池(六):ThreadLocal相关知识详解一、概述定义与作用应用场景 二、ThreadLocal基本使用创建ThreadLocal对象设置和获取值初始化值完整示例 三、ThreadLocal的实现原…...

WSL 中 nvidia-smi: command not found的解决办法
前言 在使用基于 Linux 的 Windows 子系统(WSL)时,当我们执行某些操作后,可能会遇到输入 nvidia-smi 命令却无法被系统识别的情况。 例如,在终端中输入nvidia-smi 后,系统返回提示 -bash: nvidia-smi: co…...

FPGA前瞻篇-组合逻辑电路设计-多路复用器
多路选择器(MUX)简介 基本概念 多路选择器(MUX,Multiplexer)是一种多输入、单输出的组合逻辑电路。 它通过选择控制信号,在多个输入信号中选择一个连接到输出端。 可以理解为一个多路数字开关。 &…...
作为高速通道光纤传输模式怎么理解以及到底有哪些?
光纤的传输模式主要取决于光纤的结构(如纤芯直径和折射率分布),不同模式对应光波在光纤中传播的不同路径和电磁场分布。以下是光纤传输模式的主要分类及特点: 1. 单模光纤(Single-Mode Fiber, SMF) 核心特点: 纤芯直径极小(通常为 8-10微米),仅允许光以单一模式(…...

【Castle-X机器人】五、物联网模块配置与调试
持续更新。。。。。。。。。。。。。。。 【Castle-X机器人】五、物联网模块配置与调试 五、物联网模块配置与调试5.1 物联网模块调试物联网模块测试:控制物联网模块:物联网模块话题五、物联网模块配置与调试 5.1 物联网模块调试 调试前需确保Castle-x与mqtt主机服务器处于同…...
马架构的Netty、MQTT、CoAP面试之旅
标题:马架构的Netty、MQTT、CoAP面试之旅 在互联网大厂的Java求职者面试中,一位名叫马架构的资深Java架构师正接受着严格的考验。他拥有十年的Java研发经验和架构设计经验,尤其对疑难问题和线索问题等有着丰富的经历。 第一轮提问ÿ…...

20250426在ubuntu20.04.2系统上打包NanoPi NEO开发板的FriendlyCore系统刷机eMMC的固件
20250426在ubuntu20.04.2系统上打包NanoPi NEO开发板的FriendlyCore系统刷机eMMC的固件 2025/4/26 21:30 缘起:使用NanoPi NEO开发板,编译FriendlyCore系统,打包eMMC固件的时候报错。 1、在ubuntu14.04下git clone异常该如何处理呢ÿ…...

JAVA---字符串
ctrlN 搜索界面(idea) API和API帮助文档 API : 应用程序编程接口(换句话说,就是别人已经写好了,我们不需要再编写,直接使用即可) Java API :就是JDK中提供的各种功能…...

MacOS 10.15上能跑大语言模型吗?
MacOS 10.15上能跑大语言模型吗? 下载安装Ollama运行大语言模型引申出的问题 MacOS 10.15.7(发布于2020年9月)作为已经发布了将近5年的系统版本能够运行当今流行的大语言模型吗?这篇文章简要介绍了在MacOS 10.15上通过Ollama运行d…...

AI Agent开发第37课-DeepSeek的多模态版JanusPro-7B本地安装
开篇 搜遍Janus Pro git issues、谷哥、国内网络,教程全都是错的。因此还是决定写一本全网唯一正确的教程。 目前网上的教程包括外网的教程都是“缺斤少量”,按照那些教程操作下来不是装不起来,就是装起来只能CPU运行,或者运行起来了Janus的Web前端老是转啊转不出内容。 …...

神经网络笔记 - 感知机
一 感知机是什么 感知机(Perceptron)是一种接收输入信号并输出结果的算法。 它根据输入与权重的加权和是否超过某个阈值(threshold),来判断输出0还是1。 二.计算方式 感知机的基本公式如下: X1, X2 : …...