数据库窗口函数实战

目录

前言

窗口函数语法

创建测试表和数据

使用示例

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;已经过去…

Stirling-PDF

Stirling-PDF 一、Stirling-PDF github: https://github.com/Stirling-Tools/Stirling-PDFAPI : https://app.swaggerhub.com/apis-docs/Stirling-Tools/Stirling-PDF/ 1、什么是 Stirling-PDF Stirling-PDF 是一个强大的、本地托管的基于Web的PDF操作工具&#xff0c;使用D…

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…

v-has 全局按钮权限设置(Vue2)

需求&#xff1a;一些操作按钮默认打开是隐藏的&#xff0c;发送后台请求返回当前登录人的人员类别&#xff0c;前端控制操作按钮权限&#xff0c;动态显示或者隐藏 操作按钮。 首先想到v-has自定义指令&#xff0c;因为当前只是一部分的权限控制&#xff0c;所以就没有放到全…

AutoSAR自适应平台架构总览--AP的初认识

AutoSAR自适应平台架构总览:AP 基础设施层&#xff08;Foundation Layer&#xff09;核心操作系统&#xff08;Core OS&#xff09;通信管理&#xff08;Communication Management&#xff09; 服务层&#xff08;Services Layer&#xff09;诊断服务&#xff08;Diagnostics S…

rust 生命周期(八)

生命周期定律和原则 1.借用检查器: Rust 编译器使用借用检查器来验证所有引用在其使用的整个过程中都是有效的。借用检查器通过生命周期来跟踪引用。 2.显式生命周期注解: 当涉及多个引用时&#xff0c;可能需要显式地指定生命周期&#xff0c;以帮助编译器理解引用之间的关…

MySQL窗口函数详解

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

day03 swagger

导入swagger3的步骤&#xff1a; pom.xml&#xff08;只需要子模块配置&#xff09;配置&#xff1a; <!--springdoc 集成了 swagger3--><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</a…

谷粒商城实战笔记-高效工作经验积累

当然&#xff0c;我会提供一个更具体的例子来说明这两个原则的重要性及其背后的惨痛经历。 1. 先理解需求&#xff0c;后写代码 惨痛经历 几年前&#xff0c;我所在的团队负责为开发一个在线预订系统。 项目启动之初&#xff0c;我们急于展示成果&#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