MySQL8开窗函数详解

开窗函数是 MySQL 8.0 引入的一个极其强大的功能,它允许你在不压缩原始行的情况下,对一组相关的行(称为“窗口”)进行计算,并为每一行返回一个值。这与 GROUP BY 聚合不同,GROUP BY 会将多行压缩成一行,而开窗函数会保留所有行的细节,同时增加聚合或排名信息。

开窗函数的核心语法是使用 OVER() 子句来定义窗口:

function_name([expression]) OVER (
    [PARTITION BY partition_expression, ... ]
    [ORDER BY sort_expression [ASC | DESC], ... ]
    [frame_clause]
)
  • PARTITION BY: 将数据分割成多个分区(类似于 GROUP BY),函数会在每个分区内独立计算。如果省略,整个结果集被视为一个分区。
  • ORDER BY: 定义分区内数据的排序方式。对于排名函数是必须的,对于聚合函数则决定了计算的范围框架。
  • frame_clause: 定义当前行所在分区中的一个子集(框架),用于聚合函数。语法通常是 ROWS BETWEEN frame_start AND frame_end(例如 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)。

开窗函数主要分为三类:

1. 序号函数

主要用于为行分配一个唯一的序号或排名。

函数 描述 特点
ROW_NUMBER() 为分区内的每一行分配一个唯一的连续序号(无论值是否相同)。 1, 2, 3, 4, 5
RANK() 为分区内的行分配排名。相同值的行排名相同,但会留下空洞 1, 2, 2, 4, 5
DENSE_RANK() 为分区内的行分配排名。相同值的行排名相同,但排名是连续的。 1, 2, 2, 3, 4
NTILE(n) 将分区内的数据尽可能平均地分配到 n 个桶中,并指定当前行所属的桶号。

示例:
假设有一个 sales 表,包含 salesperson(销售员)和 amount(销售额)。

SELECT
  salesperson,
  amount,
  ROW_NUMBER
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值