SQL中的函数--开窗函数

文章目录

    • [🧩 一、什么是开窗函数?](#🧩 一、什么是开窗函数?)
    • [🛠️ 二、基本语法](#🛠️ 二、基本语法)
    • [📚 三、常见开窗函数分类](#📚 三、常见开窗函数分类)
    • 小结:开窗函数三要素
    • 四、常用开窗函数介绍
      • [📌 一、排名类函数(Ranking Functions)](#📌 一、排名类函数(Ranking Functions))
        • [1. `ROW_NUMBER()`](#1. ROW_NUMBER())
        • [2. `RANK()`](#2. RANK())
        • [3. `DENSE_RANK()`](#3. DENSE_RANK())
      • [📌 二、聚合类函数(Aggregate as Window Functions)](#📌 二、聚合类函数(Aggregate as Window Functions))

🧩 一、什么是开窗函数?

开窗函数 (Window Function)是一种在 不合并行 的前提下,对一组"相关行"进行计算的 SQL 函数。

✅ 和 GROUP BY 的区别:

  • GROUP BY 会把多行"压缩"成一行(比如求平均值后只返回一个数)。
  • 开窗函数保留每一行,同时告诉你"这行在某个分组/窗口里的位置或统计值"。

🛠️ 二、基本语法

sql 复制代码
函数名(...) OVER (
    [PARTITION BY 字段1, 字段2, ...]   -- 按什么分组(可选)
    [ORDER BY 字段 ASC|DESC]           -- 窗口内如何排序(可选)
    [窗口范围子句]                      -- 比如 ROWS BETWEEN ...(可选)
)

📚 三、常见开窗函数分类

类型 常见函数 作用
排名类 ROW_NUMBER(), RANK(), DENSE_RANK() 给行编号或排名
聚合类 SUM(), AVG(), COUNT(), MAX(), MIN() 在窗口内做聚合
偏移类 LAG(), LEAD(), FIRST_VALUE(), LAST_VALUE() 获取前/后一行的值

⚠️ 注意:这些函数 只有在 OVER() 子句中使用时才是开窗函数


小结:开窗函数三要素

要素 作用
OVER() 标志这是一个开窗函数
PARTITION BY "分组",但不合并行
ORDER BY(在 OVER 里) 定义窗口内顺序,影响排名、累计等

四、常用开窗函数介绍

📌 一、排名类函数(Ranking Functions)

这类函数用于给数据"排序编号",常用于 Top N、排行榜等场景。

1. ROW_NUMBER()
  • 作用 :为每一行分配一个 唯一的连续序号,即使值相同也会编号不同。
  • 特点 :严格按顺序编号,永不重复、不跳号
sql 复制代码
ROW_NUMBER() OVER (ORDER BY salary DESC)

💡 示例:

薪资:9000, 9000, 8000

→ 编号:1, 2, 3


2. RANK()
  • 作用 :排名,相同值名次相同 ,但会 跳过后续名次
  • 特点:有"并列",但会"断号"。
sql 复制代码
RANK() OVER (ORDER BY score DESC)

💡 示例:

分数:100, 100, 90

→ 排名:1, 1, 3(跳过了第2名)


3. DENSE_RANK()
  • 作用 :排名,相同值名次相同 ,但 不会跳号
  • 特点:有"并列",但名次连续。
sql 复制代码
DENSE_RANK() OVER (ORDER BY score DESC)

💡 示例:

分数:100, 100, 90

→ 排名:1, 1, 2

三者对比总结

分数 ROW_NUMBER RANK DENSE_RANK
100 1 1 1
100 2 1 1
90 3 3 2
80 4 4 3

📌 二、聚合类函数(Aggregate as Window Functions)

这些你熟悉的聚合函数,在加上 OVER() 后就变成了开窗函数 ------ 保留原表所有行,同时计算窗口内的统计值。

常见函数:
  • SUM():窗口内求和
  • AVG():窗口内平均值
  • COUNT():窗口内行数
  • MAX() / MIN():窗口内最大/最小值

✅ 关键:不用 GROUP BY,每行都保留!

示例:
sql 复制代码
SELECT 
    name, dept, salary,
    AVG(salary) OVER (PARTITION BY dept) AS avg_dept_salary
FROM employees;

相关推荐
倔强的石头_15 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
武子康21 小时前
大数据-237 离线数仓 - Hive 广告业务实战:ODS→DWD 事件解析、广告明细与转化分析落地
大数据·后端·apache hive
大大大大晴天1 天前
Flink生产问题排障-Kryo serializer scala extensions are not available
大数据·flink
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
武子康3 天前
大数据-236 离线数仓 - 会员指标验证、DataX 导出与广告业务 ODS/DWD/ADS 全流程
大数据·后端·apache hive
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
武子康4 天前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet