0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

sql窗口函数

分享:

SQL 窗口函数(Window Function)是一种在数据库查询中执行跨行计算的高级功能。它不会合并多行结果(如 GROUP BY),而是为每一行返回一个基于指定窗口范围的计算结果,同时保留原始行的所有细节。

核心概念(中文术语)

  1. 窗口(Window)
    定义函数计算的数据范围,由 OVER() 子句指定。
  2. 分区(PARTITION BY)
    将数据按列分组,函数在每个分区内独立计算(类似分组)。
  3. 排序(ORDER BY)
    定义分区内数据的排序方式,影响计算顺序。
  4. 窗口框架(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

关键技巧

  1. 动态范围
    • ROWS BETWEEN 2 PRECEDING AND CURRENT ROW → 当前行+前2行
    • RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND CURRENT ROW → 时间范围
  2. 省略范围
    若仅用 ORDER BY 未指定范围,默认 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(从分区首行到当前行)。
  3. 性能
    合理使用 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

移动窗口函数分析

《利用Python进行数据分析》 117 移动窗口函数

wang2222222 2019-10-28 11:02:11

最实用的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

如何去使用WWDG窗口看门狗操作库函数

窗口看门狗的操作步骤有哪些?怎样去编写窗口看门狗的主程序和子程序?如何去使用WWDG窗口看门狗操作库函数

飘逸的D 2021-08-03 07:10:38

深度剖析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

加载更多
相关标签