MySQL 技巧:巧用窗口函数计算累计值
在日常开发中,经常遇到需要计算累计销售额、排名或同比数据的场景。传统做法依赖子查询或变量,复杂且易错。MySQL 8.0 引入的窗口函数可以优雅解决这类问题。
场景:按月统计订单总额及累计总额
假设有订单表 orders,字段:order_date、amount。需要输出每月总额及截止当月的累计总额。
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
SUM(amount) AS monthly_total,
SUM(SUM(amount)) OVER (ORDER BY DATE_FORMAT(order_date, '%Y-%m')) AS cumulative_total
FROM orders
GROUP BY month
ORDER BY month;
核心技巧:SUM(SUM(amount)) OVER (...)
- 内层
SUM(amount)按月聚合得到月度总额。 - 外层
SUM(...) OVER对聚合结果开窗,按月份顺序累加,轻松获得累计值。
更多窗口函数应用
- 排名:
ROW_NUMBER()、RANK()去重排序。 - 环比:
LAG(amount, 1)获取上月值,直接计算增长率。
窗口函数让复杂统计变得简洁高效,建议升级到 MySQL 8.0 后重点掌握。