第7章 窗口函数:不折叠行的聚合


第7章 · 窗口函数:不折叠行的聚合

本章要回答的三个问题: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 的最高形态。

读完能解决什么

  • 写出聚合函数加 OVER 的开窗查询,解释它与 GROUP BY 输出形状的本质差异;
  • 用 PARTITION BY 把全表窗切成组内窗,用窗内 ORDER BY 建立行的先后;
  • 区分三个排名函数在同分并列时的行为,并按业务选对那一个;
  • 掌握"ROW_NUMBER 等于 1"的组内去重取首套路,以及配合派生表筛排名的写法;
  • 用 LAG 与 LEAD 计算环比与变化量,用窗口框做组内累计与移动均值;
  • 说出窗口函数不能出现在 WHERE 里的原因及正确的筛选用派生表/CTE 套一层。

各节怎么分工

节 回答哪个问题 关键产出
7.1 OVER 开窗与分区 汇总值怎么不折叠行 OVER 语法、PARTITION BY、执行位置与限制
7.2 排名函数与去重实战 组内怎么排序取首 三兄弟行为对照、组内去重、排名筛选套路
7.3 LAG、LEAD 与移动聚合 行与行怎么比较 环比同比、首行 NULL、累计与移动窗

先决条件

  • 第 4 章聚合函数与 GROUP BY(窗口函数复用同一批聚合函数,只是换了个"容器");
  • 第 1 章逻辑执行顺序(窗口函数的执行位置决定了它不能进 WHERE,这条限制是本理解的关键)。

本章知识点清单

  • 能写出 AVG 加 OVER 的最简开窗查询并解释输出行数为何等于原表行数;
  • 能说明 PARTITION BY 与 GROUP BY 的三点差异:是否折叠、分区列是否必须出现在 SELECT、能否与同行明细共存;
  • 能推断窗口函数在逻辑执行顺序中的位置(SELECT 阶段附近、ORDER BY 之前)及由此带来的 WHERE 限制;
  • 能对同一组数据分别算出三种排名函数的结果并解释并列时的差别;
  • 能写出按价格组内排序取每组第一名的完整语句(派生表或 CTE 包装);
  • 能用 LAG 计算环比并用 IFNULL 处理首行 NULL;
  • 能写出 SUM 加 OVER 的组内累计与带 ROWS BETWEEN 的移动合计;
  • 能说出窗口函数与 GROUP BY 同句共存时的求值规则。

本章概念全景

窗口函数一句话:聚合的视野,明细的身段——窗内算汇总,行行都保留。

往下走到哪

窗口函数让复杂逻辑一行行贴着数据走,但整条查询依然会越写越长。下一章引入 WITH(CTE):给子查询与窗口结果起名字、分步搭脚手架,再配合视图把常用查询固化成"虚拟表"——查询工程化的最后一块拼图。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U