本章要回答的三个问题:GROUP BY 聚合时明细行被折叠掉了,怎么才能"每行旁边挂一个汇总值"——既看组均值又看每一行?同一个组内怎么给行排名、取上一行、算累计——行与行之间的比较用什么做?排名三兄弟 ROW_NUMBER、RANK、DENSE_RANK 同分并列时行为有何不同,去重取第一条的套路怎么写?窗口函数是 SQL:2003 之后现代数据库的标配,也是数据分析师的分水岭。
第 4 章埋下的遗憾在本章兑付。需求"每本书价格 + 所属分类的平均价",GROUP BY 的解法要把表查两遍再拼回去(子查询版的别扭你应该在第 6 章体会过了);窗口函数一行搞定:AVG(price) OVER (PARTITION BY category_id)——算出分类均值,但不折叠行。聚合函数从"折叠器"升级成"开窗器":OVER 子句圈定一扇窗口,函数在窗内计算,结果贴回每一行。
本章三小节沿能力递进:先掌握 OVER 与 PARTITION BY 的开窗机制;再用排名函数解决组内排序与"每组取第一条"这一高频需求;最后用 LAG、LEAD 与移动窗做行间对比——环比、同比、累计,这些报表的灵魂指标全部就位。窗口函数与 CTE(第 8 章)的组合,是你能写出的现代 SQL 的最高形态。
| 节 | 回答哪个问题 | 关键产出 |
|---|---|---|
| 7.1 OVER 开窗与分区 | 汇总值怎么不折叠行 | OVER 语法、PARTITION BY、执行位置与限制 |
| 7.2 排名函数与去重实战 | 组内怎么排序取首 | 三兄弟行为对照、组内去重、排名筛选套路 |
| 7.3 LAG、LEAD 与移动聚合 | 行与行怎么比较 | 环比同比、首行 NULL、累计与移动窗 |
窗口函数一句话:聚合的视野,明细的身段——窗内算汇总,行行都保留。
窗口函数让复杂逻辑一行行贴着数据走,但整条查询依然会越写越长。下一章引入 WITH(CTE):给子查询与窗口结果起名字、分步搭脚手架,再配合视图把常用查询固化成"虚拟表"——查询工程化的最后一块拼图。