为何使用MAX聚合函数的SQL PIVOT会返回同一职业的多个值?
为什么使用MAX聚合函数后同一职业仍返回多个值?
这问题的核心在于你添加的ROW_NUMBER(),它直接改变了PIVOT的分组逻辑,拆解来看:
子查询里的ROW_NUMBER作用
子查询中ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name)会按职业分组,每组内按姓名排序,给每行分配一个唯一的行号rn:- Doctor组:George(rn=1)、Smith(rn=2)
- Professor组:Baker(rn=1)
- Singer组:Davis(rn=1)、Head(rn=2)
- Actor组:Miller(rn=1)
PIVOT的分组依据
PIVOT执行时,会把除了聚合列(Name)和转置列(Occupation)之外的所有列作为分组键,这里就是rn。所以PIVOT会按rn的值分成两组:rn=1和rn=2。- 对于rn=1的组:每个职业下只有一个对应的Name,MAX(Name)就是这个Name本身,对应结果的第一行。
- 对于rn=2的组:只有Doctor和Singer有对应的数据,其他职业没有rn=2的行,所以返回NULL,MAX(Name)取到的就是这两个职业的第二个Name,对应结果的第二行。
移除ROW_NUMBER后的变化
如果去掉rn,子查询只有Occupation和Name两列,PIVOT就没有额外的分组键,会把整个表作为一个分组。这时候每个职业下取MAX(Name),只会得到一行结果:Doctor Professor Singer Actor Smith Baker Head Miller
简单说,ROW_NUMBER()给每行加了“组标识”,让PIVOT按行号分组聚合,而非按职业整体聚合,所以同一职业会在不同行号组里出现多个值。
内容的提问来源于stack exchange,提问作者bilal94.
相关产品推荐
相关产品推荐

