MySQL窗口函数表
时间: 2025-01-03 19:20:41 浏览: 7
### MySQL 窗口函数简介
MySQL 的窗口函数(也称为分析函数)允许对查询结果中的每一行应用复杂的计算,而不会改变原始数据的物理顺序。这些函数特别适用于执行诸如排名、累计求和以及移动平均等操作。
#### 常见窗口函数及其用途
1. **ROW_NUMBER()**
此函数为分区内的每条记录分配唯一的行号,从1开始按指定顺序递增[^1]。
2. **RANK() 和 DENSE_RANK()**
这两个函数用于给定排序标准下的排名。`RANK()`会跳过重复项后的名次,而`DENSE_RANK()`则连续编号[^3]。
3. **SUM(), AVG(), MIN(), MAX()**
聚合类窗口函数可以用来计算累积总量、均值以及其他统计量。通过`OVER`子句定义作用范围来控制其行为[^4]。
4. **LAG() 和 LEAD()**
获取当前行之前或之后某一行的数据,常用于比较相邻时间段的变化情况[^2]。
#### SQL 语法结构
窗口函数的一般形式如下:
```sql
<窗口函数> OVER (
[PARTITION BY <列列表>]
[ORDER BY <排序列> [ASC|DESC]]
)
```
- `PARTITION BY`: 将结果集划分为多个逻辑分组,在每个分区内独立运算。
- `ORDER BY`: 定义各行之间的相对位置关系,影响某些特定类型的窗口函数的结果。
#### 实际案例展示
假设有一个名为`sold_items`的销售表格,包含商品名称(`item`)、出售日期(`sale_date`)及数量(`quantity`)字段。下面是一些具体的应用场景:
##### 示例 1: 计算每日销量趋势
要查看每天各类产品售出的数量变化,可采用以下语句:
```sql
SELECT item,
sale_date,
quantity,
SUM(quantity) OVER (PARTITION BY item ORDER BY sale_date ASC) as cumulative_quantity
FROM sold_items;
```
这段代码不仅返回了单日销量,还提供了截至当天为止的历史累加值。
##### 示例 2: 排序并标记排名
如果希望知道某个时期内最畅销的产品排行,则可以用到`ROW_NUMBER()`或其他类似的排名函数:
```sql
WITH ranked_sales AS (
SELECT item,
SUM(quantity*price) as total_revenue,
ROW_NUMBER() OVER (ORDER BY SUM(quantity*price) DESC) as rank_num
FROM sold_items
GROUP BY item
)
SELECT *
FROM ranked_sales;
```
此查询先汇总各产品的总收入,再按照金额大小降序排列,并赋予相应的位次标签。
阅读全文