MySQL排序窗口函数
封面图
•
2025-10-21
•
MySQL
182
0
0
0
在 MySQL 中,**窗口函数(Window Functions)** 是从 **MySQL 8.0** 开始引入的功能,它允许你在查询中对数据进行分组、排序,并在每一行上执行聚合计算,而不会将多行合并为一行。 ### 一、什么是窗口函数? 窗口函数是用于在一组行上执行计算的函数,这些行通常与当前行有某种关联(如同一组内的其他行)。它们可以配合 `OVER()` 子句使用。 --- ## 二、常用窗口函数 | 函数名 | 功能 | |--------|------| | `ROW_NUMBER()` | 为每一行分配一个唯一的序号 | | `RANK()` | 分配排名,如果有并列则跳过后续排名 | | `DENSE_RANK()` | 分配排名,如果有并列则不跳过后续排名 | | `NTILE(n)` | 将分区中的行分成 `n` 个桶 | | `SUM()`, `AVG()`, `MIN()`, `MAX()` | 聚合函数作为窗口函数使用 | | `LEAD()` / `LAG()` | 获取前一行或后一行的值 | --- ## 三、基本语法 ```sql SELECT column1, column2, window_function(column) OVER ( PARTITION BY partition_column ORDER BY sort_column [ROWS BETWEEN ...] ) AS alias_name FROM table_name; ``` - `PARTITION BY`: 按哪些列分组 - `ORDER BY`: 在每个分组内按什么排序 - `ROWS BETWEEN ...`: 定义窗口的范围(可选) --- ## 四、示例 假设我们有一个 `sales` 表: | id | product | amount | sale_date | |----|---------|--------|-----------| | 1 | A | 100 | 2024-01-01| | 2 | B | 200 | 2024-01-01| | 3 | A | 150 | 2024-01-02| | 4 | B | 250 | 2024-01-02| ### 示例 1:使用 `ROW_NUMBER()` ```sql SELECT id, product, amount, ROW_NUMBER() OVER (ORDER BY sale_date) AS row_num FROM sales; ``` ### 示例 2:按产品分组,按日期排序 ```sql SELECT id, product, amount, ROW_NUMBER() OVER (PARTITION BY product ORDER BY sale_date) AS row_num FROM sales; ``` ### 示例 3:使用 `RANK()` 和 `DENSE_RANK()` ```sql SELECT id, product, amount, RANK() OVER (ORDER BY amount DESC) AS rank, DENSE_RANK() OVER (ORDER BY amount DESC) AS dense_rank FROM sales; ``` ### 示例 4:使用 `SUM()` 作为窗口函数 ```sql SELECT id, product, amount, SUM(amount) OVER (PARTITION BY product) AS total_amount FROM sales; ``` ### 示例 5:使用 `LEAD()` / `LAG()` ```sql SELECT id, product, amount, LAG(amount, 1) OVER (ORDER BY sale_date) AS prev_amount, LEAD(amount, 1) OVER (ORDER BY sale_date) AS next_amount FROM sales; ``` --- ## 五、窗口函数的“窗口范围”(ROWS BETWEEN) 你可以定义窗口的范围,例如: ```sql SUM(amount) OVER ( ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative_sum ``` 或者: ```sql AVG(amount) OVER ( ORDER BY sale_date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS moving_avg ``` --- ## 六、注意事项 - 窗口函数只能在 **MySQL 8.0 及以上版本** 使用。 - 不支持在 `WHERE` 子句中使用窗口函数。 - 窗口函数不能直接用于 `GROUP BY` 或 `HAVING`。 --- ## 七、总结 MySQL 的窗口函数极大地增强了数据分析能力,特别是处理排名、累计、移动平均等复杂查询时非常有用。掌握这些函数能显著提升 SQL 查询的灵活性和效率。 如果你有具体的业务场景或想实现某个功能,我可以帮你写出对应的 SQL 语句 😊
上一篇:
sql找出连续7天登陆,连续30天登陆的用户
下一篇:
MySQL中 IN/EXIST的联系和区别?
标题录入,一次不能超过6条
返回顶部
留言
留言
评论