SQL 窗口函数(Window Function)是一种在数据库查询中执行跨行计算的高级功能。它不会合并多行结果(如 GROUP BY),而是为每一行返回一个基于指定窗口范围的计算结果,同时保留原始行的所有细节。
核心概念(中文术语)
- 窗口(Window)
定义函数计算的数据范围,由OVER()子句指定。 - 分区(PARTITION BY)
将数据按列分组,函数在每个分区内独立计算(类似分组)。 - 排序(ORDER BY)
定义分区内数据的排序方式,影响计算顺序。 - 窗口框架(Window Frame)
指定当前行相关的计算范围(如 "前3行到后1行")。
常用窗口函数分类
1. 排名函数
| 函数 | 作用 | 示例(按分数排名) | |
|---|---|---|---|
ROW_NUMBER() |
生成唯一序号(相同值也按顺序编号) | → | 1, 2, 3, 4 |
RANK() |
并列时跳过后续名次 | → | 1, 1, 3, 4 |
DENSE_RANK() |
并列时不跳名次 | → | 1, 1, 2, 3 |
NTILE(n) |
将数据分为 n 组并编号 |
→ | 分4组:1,1,2,2,3,3,4,4 |
2. 聚合函数(支持窗口计算)
| 函数 | 作用 |
|---|---|
SUM(列) OVER() |
窗口内求和 |
AVG(列) OVER() |
窗口内平均值 |
COUNT(列) OVER() |
窗口内计数 |
MAX(列) OVER() |
窗口内最大值 |
MIN(列) OVER() |
窗口内最小值 |
3. 偏移函数
| 函数 | 作用 |
|---|---|
LAG(列, 偏移量) |
获取当前行之前的第 N 行数据 |
LEAD(列, 偏移量) |
获取当前行之后的第 N 行数据 |
FIRST_VALUE(列) |
获取窗口内第一行的值 |
LAST_VALUE(列) |
获取窗口内最后一行的值 |
语法结构
SELECT
列1, 列2,
窗口函数(列) OVER (
[PARTITION BY 分组列]
[ORDER BY 排序列 [ASC|DESC]]
[ROWS|RANGE 范围子句]
) AS 结果列名
FROM 表名;
实际案例
数据表 sales
| date | product | amount |
|---|---|---|
| 2023-01-01 | A | 100 |
| 2023-01-02 | A | 200 |
| 2023-01-03 | A | 150 |
| 2023-01-01 | B | 50 |
示例 1:计算每个产品的累计销售额
SELECT
date, product, amount,
SUM(amount) OVER (
PARTITION BY product
ORDER BY date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM sales;
| 结果: | date | product | amount | running_total |
|---|---|---|---|---|
| 2023-01-01 | A | 100 | 100 | |
| 2023-01-02 | A | 200 | 300 | |
| 2023-01-03 | A | 150 | 450 | |
| 2023-01-01 | B | 50 | 50 |
示例 2:计算每个产品销售额的排名
SELECT
product, amount,
RANK() OVER (
PARTITION BY product
ORDER BY amount DESC
) AS rank
FROM sales;
| 结果(产品A内部排名): | product | amount | rank |
|---|---|---|---|
| A | 200 | 1 | |
| A | 150 | 2 | |
| A | 100 | 3 | |
| B | 50 | 1 |
关键技巧
- 动态范围:
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW→ 当前行+前2行RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND CURRENT ROW→ 时间范围
- 省略范围:
若仅用ORDER BY未指定范围,默认RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(从分区首行到当前行)。 - 性能:
合理使用PARTITION BY和索引可提升效率。
? 窗口函数在数据分析中广泛应用,如计算移动平均、累计占比、数据排名等场景,能大幅简化复杂查询逻辑。
sql中日期函数的用法
日期函数在SQL中是非常重要的功能之一,它们能帮助我们在数据库中存储和处理日期和时间数据。在本文中,我将详细介绍一些常用的SQL日期函数,包括如何创建日期和时间数据、如何格式化和转换日期、以及如何在
2023-11-17 16:24:51
常用SQL函数及其用法
SQL(Structured Query Language)是一种用于管理和操作关系数据库的编程语言。SQL 提供了丰富的函数库,用于数据检索、数据更新、数据删除以及数据聚合等操作。以下是一些常用
2024-11-19 10:18:59
如何用Rust过程宏魔法简化SQL函数呢?
这是 RisingWave 中一个 SQL 函数的实现。只需短短几行代码,通过在 Rust 函数上加一行过程宏,我们就把它包装成了一个 SQL 函数。
2024-01-23 09:43:34
Devart数据库开发和管理软件:SQL Server
通过逐步执行、调用堆栈浏览、断点和监视来观察SQL脚本、存储过程、触发器和函数在运行时的行为,从而查找它们中的错误。在“监视”窗口中计算例程中声明的变量和参数。
2023-03-31 10:04:17
长期用眼不再怕!NineData SQL 窗口支持深色模式
、改善低光环境,并适用于开发人员、夜间工作者和移动设备用户等不同群体。您可以在NineData SQL窗口中尝试深色模式,享受更加舒适和愉悦的使用体验。
2023-09-26 10:24:06
MySQL去重3种方法分享
在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函数的 sql(如Hive SQL、Oracle等等) 中还可以使用 row_number 窗口函数进行去重。
2023-06-26 11:05:39
oracle执行sql查询语句的步骤是什么
。以下是对每个步骤的详尽、详实、细致的解释。 编写SQL语句: SQL(结构化查询语言)是一种用于与数据库进行通信的标准语言。在使用Oracle执行SQL查询之前,首先需要编写SQL语句。SQL语句由关键字、表名、列名、运算符、函数等组成,用于指定所需的数据和操作。 解析
2023-12-06 10:49:29
SQL语句的两种嵌套方式
一般情况下,SQL语句是嵌套在宿主语言(如C语言)中的。有两种嵌套方式:1.调用层接口(CLI):提供一些库,库中的函数和方法实现SQL的调用2.直接嵌套SQL:在代码中嵌套SQL语句,提交给预处理器,将SQL语句转换成对宿主语言有意义的内容,如调用库中的函数和方法代替SQL语句
60user79
2019-05-23 08:51:34
SQL语言的两种使用方式
编写)-DBMS预处理程序-预处理过的源程序(嵌入的SQL语句已转换成函数调用形式)-宿主语言编译程序(SQL函数定义库)-目标程序嵌入式SQL涉及到SQL语句在主语言程序中的使用规定,以解决两种语言的不一致和相互联系的问题。...
张峰9998
2021-12-20 06:51:26
SQL后悔药,SQL性能优化和SQL规范优雅
每一个好习惯都是一笔财富,本文基于MySQL,分SQL后悔药, SQL性能优化,SQL规范优雅三个方向,分享写SQL的21个好习惯,谢谢阅读,加油哈~ 1. 写完SQL先explain查看执行计划
2020-11-14 09:54:27
深入分析慢SQL的排查、解决思路
出于一些历史原因有的SQL查询可能非常复杂,需要同时关联非常多的表,使用一些复杂的函数、子查询,这样的SQL在项目初期由于数据量比较少,不会对数据库造成较大的压力,但是随着时间的积累以及业务的发展,这些SQL慢慢就会转变为慢SQL,对数据库的性能产生一定的影响。
2023-10-31 10:29:33
最实用的SQL语句快来收藏学习吧
文章沿着设计一个假想的应用 awesome_app 为主线,从零创建修改数据库,表格,字段属性,索引,字符集,默认值,自增,增删改查,多表查询,内置函数等实用 SQL 语句。收藏此文,告别零散又低效
2019-12-21 11:04:13
区分SQL语句与主语言语句
为了区分SQL语句与主语言语句,所有SQL 语句必须加前缀EXEC SQL处理过程:含嵌入式SQL语句的主语言程序预编译程序转换嵌入式SQL语句为函数调用转换后的主语言程序(形式上消除了SQL)主语
新星之火12138
2021-10-28 08:44:39
MyBatis动态sql是什么?MyBatis动态SQL最全教程
动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。
2023-08-10 10:18:02
MySQL流程函数的操作方法
流程函数是一类很常用的函数,我们可以通过流程函数在SQL语句中实现条件选择,能实现我们想要的条件判断。下表列出了MySQL中的流程函数。
2020-04-16 17:17:15
SQL编程技术的特点有哪些
SQL的处理过程嵌入式SQL是将SQL语言嵌入程序设计语言中,被嵌入的程序设计语言,如C++,C,JAVA等称为宿主语言,简称主语言过程如下1:含嵌入式SQL语句的主语言程序。2:关系数据库管理系统预处理程序转换嵌入式SQL语句为函数调用。3:转换后的主语言程序。4:主语言编译程序编译处理。5:
hdfsf
2021-12-22 07:04:22
php的mysqli_query的函数处理
mysqli_query是PHP中用于执行SQL查询的函数。它允许我们将SQL语句发送到MySQL数据库,并返回一个结果集(如果适用)。在本文中,我们将详细介绍mysqli_query函数的使用,并
2023-12-04 16:03:50
嵌入式SQL程序是由什么组成的
的C程序 (.c),并且后来它能够被一个C编译器所处理。转换过的ECPG应用会通过嵌入式SQL库(ecpglib)调用libpq库中的函数,并且与PostgresSQL服务器使用普通的前端/后端协议
hgimtk
2021-12-15 07:26:54
什么是SQL注入?Java项目防止SQL注入方式
Java项目防止SQL注入方式 这里总结4种: PreparedStatement防止SQL注入 mybatis中#{}防止SQL注入 对请求参数的敏感词汇进行过滤 nginx反向代理防止SQL注入
2023-10-16 14:26:34
深度剖析SQL中的Grouping Sets语句1
SQL 中 `Group By` 语句大家都很熟悉, **根据指定的规则对数据进行分组** ,常常和**聚合函数**一起使用。
2023-05-10 17:44:11
窗口看门狗( WWDG)库函数配置有哪些步骤
窗口看门狗( WWDG)是如何工作的?窗口看门狗( WWDG)有哪些相关的寄存器?窗口看门狗( WWDG)库函数配置有哪些步骤?
xf20160629
2021-08-16 06:04:50
深度剖析SQL中的Grouping Sets语句2
SQL 中 `Group By` 语句大家都很熟悉, **根据指定的规则对数据进行分组** ,常常和**聚合函数**一起使用。
2023-05-10 17:44:27
为什么要动态sql语句?
为什么要动态sql语句?因为动态sql语句能够提供一些比较友好的机制1、可以使得一些在编译过程中无法获得完整的sql语句,在程序执行阶段动态的获得。2、支持动态组装 sql语句、动态参数 两种形式动态sql语句有两种1、使用sql主变量2、使用动态参数...
程序诗人
2021-12-20 06:00:51
动态Sql介绍
动态Sql介绍 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格
2023-05-31 09:34:42
PROC SQL介绍
SQL(Structured Query Language)——结构化查询语言,是用于检索和更新数据的一种标准化语言,SQL在SAS中通过PROC SQL来实现。
2023-05-19 16:10:41
怎样在MATLAB中创建函数
返回命令窗口。输入“ make_a_square(3)”,然后按键盘上的Enter键以测试功能。您的代码应将数字3平方,输出9。如果代码未执行此操作,请检查以确保在“命令窗口”中正确拼写了该函数
2019-11-04 11:07:01
sql是什么意思网络用语
sql是什么意思?sql是结构化查询语言(Structured Query Language)的缩写。它是一种专门用于管理关系型数据库系统的编程语言。sql用于执行各种数据库操作,包括创建、修改
2023-10-13 17:31:51
mysql和sql server区别
MySQL和SQL Server是两种常见的关系型数据库管理系统(RDBMS),用于存储和管理数据库。虽然它们都支持SQL语言,但在其他方面存在一些显著的区别。以下是MySQL和SQL Server
2023-11-21 11:07:28
