超越传统查询:窗口函数的新思维

Part1介绍

窗口函数也称为 OLAP 函数。OLAP 是 OnLine AnalyticalProcessing 的简称,意思是对数据库数据进行实时分析处理。窗口函数是一种用于执行聚合计算和排序操作的功能强大的sql函数。它们可以在查询结果集中创建一个窗口(window),并在该窗口上进行计算,而不影响结果集的整体。

窗口函数通常与over子句一起使用,以定义窗口的范围。over子句可以指定窗口的排序方式、分区方式和边界等。

为了便于理解,称之为 窗口函数。常规的 select 语句都是对整张表进行查询,而窗口函数可以让我们有选择的去某一部分数据进行汇总、计算和排序。

Part2用法

窗口函数的通用形式:

sql 复制代码
<窗口函数> over ([ partition by <列名> ] [ order by <排序用列名> ])  

\]中的内容可以省略。 窗口函数最关键的是搞明白关键字 partiton by 和 order by 的作用。 * partiton by 子句 可选参数,指示如何将查询行划分为组,类似于 group by 子句的分组功能,但是 partition by 子句并不具备 group by 子句的汇总功能,并不会改变原始表中记录的行数。 * order by 子句 可选参数,指示如何对每个分区中的行进行排序,即决定窗口内,是按那种规则(字段)来排序的。 注意: > 虽然 partiton by 子句 和 order by 子句 都是可选参数,但是两个参数不能同时没有(最少二选一)。不然, \<窗口函数\> over( ) 这种用法没用实际意义(窗口由所有查询行组成,窗口函数使用所有行计算结果)。 # Part3分类 常用的窗口函数有: * row_number():为每一行返回一个唯一的数值,通常用于给结果集中的行进行编号。 * rank()和dense_rank():根据指定的排序顺序,为结果集中的每一行分配一个排名。rank()在遇到相同的值时会跳过相同的排名,而dense_rank()不会跳过。 * lag()和lead():lag函数用于获取当前行之前的某一行的值,lead函数用于获取当前行之后的某一行的值。它们与排序有关,可以用于查找前一行或后一行的值。 * sum()、avg()、min()、max()等聚合函数:这些聚合函数可以在窗口范围内进行计算,并返回结果集中每一行的聚合值。 除了以上列举的函数外,窗口函数还有其他一些类型和变种,可以根据具体的需求选择使用。 窗口函数在sql中的应用非常广泛,可以用于计算移动平均、累计求和、分组内排序等。它们提供了一种灵活且高效的方式来处理复杂的查询需求。 # Part4尾声 ![1704863801339658219.png](https://file.jishuzhan.net/article/1747500866845282306/1e83a331d57ef28413e9007cd97d4042.webp) 那就先整理到这里, 欢迎大家关注: `统计小白er`. 有更多的整理分享和相关资料呦\~ 欢迎加入我们的学习SQL系列: `SQL挖掘机系列`: 这一系列涵盖了SQL的基本用法,就像是给你一把挖掘机,让你深入挖掘SQL的奥秘。 `SQL进阶系列`: 这一系列涵盖了SQL的进阶用法,最好是食用完`SQL挖掘机系列`再进行拓展, 这样效果会更好一些\~ 让我们一同握住这把魔法棒,打开SQL的魔法大门,开始一场关于SQL学习的奇幻之旅吧!

相关推荐
VX:Fegn089513 小时前
计算机毕业设计|基于springboot + vue养老院管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
XuCoder13 小时前
零成本从0到1搭建个人博客
后端
雨夜之寂14 小时前
大模型 ai coding 比较
后端·面试
RoyLin14 小时前
Rust 编写的 40MB 大小 MicroVM 运行时,完美替代 Docker 作为 AI Agent Sandbox
后端·架构·rust
风象南16 小时前
无文档遗留系统的逆向梳理:利用 AI 重建架构视图
后端
金銀銅鐵17 小时前
浅解 Junit 4 第六篇:AnnotatedBuilder 和 RunnerBuilder
后端·junit·单元测试
钟智强17 小时前
Erlang 从零写一个 HTTP REST API 服务
后端
王德印17 小时前
工作踩坑之导入数据库报错:Got a packet bigger than ‘max_allowed_packet‘ bytes
java·数据库·后端·mysql·云原生·运维开发
Cache技术分享17 小时前
327. Java Stream API - 实现 joining() 收集器:从简单到进阶
前端·后端
颜酱17 小时前
滑动窗口算法通关指南:从模板到实战,搞定LeetCode高频题
javascript·后端·算法