数据库窗口函数实战

目录

前言

窗口函数语法

创建测试表和数据

使用示例

PARTITION BY

窗口函数

ROW_NUMBER

RANK

DENSE_RANK

RANGE

ROWS


前言

SQL 具有很高的灵活性,可以根据需求进行复杂的数据查询和分析,支持多表联合查询(join)、排序(order by)、分组(group by)、聚合(sum)等操作。虽然以上这些操作已经能解决绝大多的查询问题了,但是还是存在一些较为特殊的场景没法很好地处理。

比如leetcode中一道SQL题:

1321. 餐馆营业额变化增长 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/restaurant-growth/description/像以上的题目的场景,每一行数据的某个字段都需要与表中的其他部分数据相同字段做聚合操作,像这种场景就无法使用 group by 实现,因为使用 group by 来对字段分组,会将表中的全部数据做聚合操作。

而数据库的窗口函数处理这些问题就非常合适。

窗口函数语法

<窗口函数 / 聚合函数> over (

partition by <用于分组的列名>
order by <用于排序的列名>
rows/range子句 <用于定义窗口大小>

)

创建测试表和数据

以下使用 MySQL 来进行演示 

create table score (
  id int auto_increment primary key,
  student_id int,
  subject varchar(20),
  score double
);

insert into score(student_id, subject, score) values(1, 'chinese', 70);
insert into score(student_id, subject, score) values(1, 'math', 70);
insert into score(student_id, subject, score) values(1, 'english', 70);
insert into score(student_id, subject, score) values(2, 'chinese', 80);
insert into score(student_id, subject, score) values(2, 'math', 80);
insert into score(student_id, subject, score) values(2, 'english', 90);
insert into score(student_id, subject, score) values(3, 'chinese', 70);
insert into score(student_id, subject, score) values(3, 'math', 50);
insert into score(student_id, subject, score) values(3, 'english', 90);

 得到如下初始数据:三个学生语数英成绩

使用示例

PARTITION BY

需求:得到每个学生的总分

可以使用分组汇总来得到每个学生的总分,partition bygroup by ,都是用于分组,但是两个分组有点区别

使用 group by 来分组,会改变总行数,因为同组的全部数据都会被汇总成一条

select student_id, sum(score) total 
from score
group by student_id

 

而使用 partition by 来分组,则不会改变总行数

select student_id, sum(score) over (partition by student_id) as total
from score

 

窗口函数

需求:得到每个学生各科的成绩排名

有三个窗口函数可以解决排名问题:

  1. ROW_NUMBER():为每一行分配一个唯一的整数,常用于生成行号。
  2. RANK():计算每个行的排名,若有相同值则排名相同,下一个排名按跳过相同值后的高一位开始。
  3. DENSE_RANK():计算每个行的排名,若有相同值则排名相同,下一个排名连续递增。

ROW_NUMBER

select *, row_number() over (partition by subject order by score desc) as ranking
from score;

 

RANK

select *, rank() over (partition by subject order by score desc) as ranking
from score;

 

 可以看到 english 科目,有两个90分都是第一名,70分只能是第三名,没有第二名

DENSE_RANK

select *, dense_rank() over (partition by subject order by score desc) as ranking
from score;

 

 可以看到 english 科目,有两个90分都是第一名,70分是第二名,不会跳过

RANGE

需求:统计每个同学 math 科目分数差距不超过10分的人数

使用聚合函数 COUNT() + RANGE 子句实现

select *,
count(*) over (order by score range between 10 preceding and 10 following) as '当前分数相差±10的人数'
from score
where subject = 'math'

 50 - 10 = 40,50 + 10 = 60,表中 [40, 60] 区间的分数只有 50 分数一个,故得到的结果为 1

同理,表中 [60, 80] 区间的分数有 70 和 80 分数,故得到的结果为 2

表中 [70, 90] 区间的分数有 70 和 80 分数,故得到的结果为 2

ROWS

没有范围子句,则是窗口大小默认是全部数据,rows 子句其实就是按照行数来确定窗口的大小

以查询 chinese 成绩为例:

select *,
sum(score) over (order by id rows 1 preceding) as '当前行+前一行',
sum(score) over (order by id rows between 1 preceding and 1 following) as '前一行+当前行+后一行',
sum(score) over (order by id rows between unbounded preceding and current row) as '开头累加到当前行',
sum(score) over (order by id rows between current row and unbounded following) as '当前行累加到结尾'
from score
where subject = 'chinese'

 

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

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

相关文章

【b站-湖科大教书匠】5 运输层 - 计算机网络微课堂

课程地址&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 5 运输层 5.1 运输层概述 5.2 运输层端口号、复用与分用…

【力扣】:比特位计数

1.去掉二进制中最左边的1&#xff0c;n&&#xff08;n-1&#xff09;&#xff0c;如果一次操作以后&#xff0c;就是0&#xff0c;那么这个数是2的倍数。进行几次操作&#xff0c;&#xff0c;变为0&#xff0c;那么就有几个1. 2.拿到最左边的1&#xff0c;n&-n 3.将…

idea中如何创建yml、yaml、properties配置文件

目录 1、配置文件 2、创建yml配置文件 3、配置文件的优先级 1、配置文件 我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件…

threejs零基础搭建3D可视化汽车展厅

前置知识(最下面有完整代码) 每个代码都有注释,零基础也能看懂 中文官方文档教程 创建项目 创建空文件夹 执行如下命令初始化package.json文件 npm init -y安装threejs包 yarn add three安装tween.js动画库,用于做动画 tweenjs文档 yarn add @tweenjs/tween.js安装gui调…

[数据集][目标检测]野猪检测数据集VOC+YOLO格式1000张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1000 标注数量(xml文件个数)&#xff1a;1000 标注数量(txt文件个数)&#xff1a;1000 标注…

Zookeeper入门篇,了解ZK存储特点

Zookeeper入门篇&#xff0c;了解ZK存储特点 前言一、为什么要用 Zookeeper&#xff1f;二、Zookeeper存储特色1. 树状结构2. 节点类型 三、存储位置1. 内存存储1. DataTree2. DataNode 2. 硬盘存储1. 事务日志2. 快照 前言 继上次说完 Zookeeper 的安装后&#xff0c;已经过去…

OpenCV图像滤波(2)均值平滑处理函数blur()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在OpenCV中&#xff0c;blur()函数用于对图像应用简单的均值模糊&#xff08;mean blur&#xff09;。这种模糊效果可以通过将图像中的每个像素替…

C++知识点:类和对象(自用)

类和对象 1. 类和对象的关系2. 对象指针3. 在堆上创建对象4. 成员访问限定符5. 名字编码&#xff08;Name Mangling&#xff09;6.构造函数7.构造函数的重载8.初始化列表8. 成员变量初始化的顺序&#xff08;通过初始化列表&#xff09;9. 初始化 const 成员变量10. 析构函数11…

MySQL窗口函数详解

MySQL窗口函数详解 MySQL从8.0版本开始引入了窗口函数&#xff0c;这是一个强大的特性&#xff0c;可以大大简化复杂的数据分析任务。本文将详细介绍MySQL窗口函数的概念、语法和常见用法&#xff0c;并结合实际应用场景进行说明。 什么是窗口函数? 窗口函数是一种能够对结…

UE5+OpenCV配置(Windows11系统)

一、概述 因为需要在UE5中使用OpenCV这些工具进行配置&#xff0c;所以在网络上参考借鉴一些资料进行配置。查询到不少的资料&#xff0c;最后将其配置成功。在这里顺便记录一下自己的配置成功的过程。 二、具体过程 &#xff08;一&#xff09;版本 使用Windows11系统、UE5.…

CSS(九)——CSS 轮廓(outline)

CSS 轮廓&#xff08;outline&#xff09; 轮廓&#xff08;outline&#xff09;是绘制于元素周围的一条线&#xff0c;位于边框边缘的外围&#xff0c;可起到突出元素的作用。 轮廓&#xff08;outline&#xff09;属性指定元素轮廓的样式、颜色和宽度。 让我们用一个图来看…

基于Java中的SSM框架实现高校心理评测与分析系统项目【项目源码+论文说明】

基于Java中的SSM框架实现高校心理评测与分析系统演示 摘要 为了让学校和教师方面更好的深入了解学生的心理&#xff0c;有助于加强学生心理建设。该系统使用Java语言开发&#xff0c;系统架构采用SSM技术来实现功能性开发&#xff0c;MySQL数据库存放数据&#xff0c;实现了进…

springAOP理解及事务

AOP&#xff1a; springAOP是什么&#xff1a; AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实就是面向特定方法编程。 使用场景&#xff1a; 比如你想统计业务中每个方法的执行耗时&#xff0c;那我们最…

git cherry-pick用法

git cherry-pick 如何将我另一个分支上的某个提交合并到新的分支上 首先切换到新分支上git cherry-pick <commit_hash>例如&#xff1a;git cherry-pick f8a70c9

python实现接缝雕刻算法

python实现接缝雕刻算法 接缝雕刻算法步骤详解Python实现详细解释优缺点应用领域接缝雕刻算法(Seam Carving Algorithm)是一种内容感知的图像缩放技术,可以智能地改变图像的尺寸,而不会明显影响其重要内容。它通过动态规划的方式寻找图像中的“接缝”,即在图像中从上到下或…

jenkins自动化持续集成

一、持续集成优势 1.1 解放重复劳动 一次设置&#xff0c;多次复用。持续集成任务可以解放集成、测试、部署等重复性劳动&#xff0c;通过自动化任务能够显著提升集成频率。 1.2 更快解决问题 接入持续集成任务后&#xff0c;能够更早地感知变更后效果&#xff0c;及时进入…

pytest结合allure-pytest插件生成测试报告

目录 一、安装allure-pytest插件 二、下载allure 三、生成allure报告 四、效果展示 一、安装allure-pytest插件 二、下载allure 下载之后解压&#xff0c;解压之后还要配置环境变量&#xff08;把allure目录下bin目录配置到系统变量的path路径&#xff09;&#xff0c;下…

mysql语法介绍

MySQL 语法主要基于 SQL&#xff08;Structured Query Language&#xff09;标准&#xff0c;用于管理和操作关系型数据库。以下是一些基本的 MySQL 语句&#xff1a; 1.创建数据库&#xff1a; CREATE DATABASE database_name; 1.选择数据库&#xff1a; USE database_name;…

WPF使用TouchSocket实现Tcp client

文章目录 前言1、页面展示2、主页面UI代码2、TCP client的UI代码3、Tcp client后台代码实现4、UI与后台代码的关联 前言 在该篇的Demo中&#xff0c;您可以找到以下内容&#xff1a; 1、TouchSocket的使用&#xff1b; 2、CommunityToolkit.Mvvm的使用&#xff1b; 3、AvalonD…

GPT-4o Mini:探索最具成本效益的小模型在软件开发中的应用

随着人工智能技术的迅猛发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域也取得了显著的进步。OpenAI 最新发布的 GPT-4o Mini 模型&#xff0c;以其卓越的性能和极具竞争力的价格&#xff0c;成为了广大开发者关注的焦点。作为一名长期关注人工智能及其在软件开发…