SQL如何通过窗口函数简化年度报表逻辑_SQL开发技巧

张开发
2026/4/19 21:11:21 15 分钟阅读

分享文章

SQL如何通过窗口函数简化年度报表逻辑_SQL开发技巧
用YEAR() OVER()可高效实现年度汇总需先提取年份再分区计算同比和排名避免全局排序错误注意数据库兼容性及分区键必须包含客户ID和年份。用 YEAR() OVER() 替代子查询拼年度汇总年度报表最常卡在“每个客户每年的销售额、同比、排名”这类需求上。传统写法是多层子查询或临时表可读性差、改起来像拆炸弹。窗口函数能直接在单次扫描中完成分组内计算关键是得把时间维度对齐到年粒度。常见错误是直接对 order_date 用 OVER (PARTITION BY customer_id)结果发现同比算乱了——因为没按年切片。必须先提取年份再作为分区依据SELECT customer_id, YEAR(order_date) AS y, SUM(amount) AS yearly_amount, LAG(SUM(amount), 1) OVER (PARTITION BY customer_id ORDER BY YEAR(order_date)) AS prev_year_amountFROM ordersGROUP BY customer_id, YEAR(order_date);YEAR(order_date) 必须出现在 GROUP BY 和 ORDER BY 中否则窗口排序无意义MySQL 8.0、PostgreSQL、SQL Server 都支持但 SQLite 不支持窗口函数别踩坑如果日期字段含时分秒YEAR() 没问题但若用 DATE_FORMAT(order_date, %Y)MySQL或 EXTRACT(YEAR FROM order_date)PostgreSQL语法要对应数据库避免 ROW_NUMBER() 在年度内错排客户TOP3“每家客户每年销售额最高的3个产品”这种需求容易误用全局 ROW_NUMBER() OVER (ORDER BY amount DESC)结果排出来的是全量TOP3不是“每年各算一遍”。核心是分区键必须包含年份和客户ID。典型错误写法ROW_NUMBER() OVER (ORDER BY amount DESC) —— 完全没分区顺序随机且不可控。正确做法 知网AI智能写作 知网AI智能写作写文档、写报告如此简单

更多文章