如何在Python或SQL中实现无聚合的Pivot(表转置)操作
表格转置实现方案(无聚合修改数值)
Python 实现
直接用 pandas 的 pivot 方法对数据进行重塑,由于你的数据中每个 (Metric, Type) 组合对应唯一的 Value,无需聚合操作即可完成转置:
import pandas as pd d = {'Type': ['a','a','a','a','a','b','b','b','b','b'], 'Metric': ['q rate','w rate','e rate','r rate', 't rate','q rate','w rate','e rate','r rate', 't rate'], 'Value':[1,2,3,4,5,9,8,7,6,5]} df = pd.DataFrame(data=d) # 执行转置操作 transposed_df = df.pivot(index='Metric', columns='Type', values='Value') print(transposed_df)
执行结果:
Type a b Metric q rate 1 9 w rate 2 8 e rate 3 7 r rate 4 6 t rate 5 5
SQL 实现
方案1:使用 PIVOT(聚合不修改数值)
SQL 的 PIVOT 语法强制要求聚合函数,但你的数据中 (Metric, Type) 是唯一组合,每个分组仅对应一个 Value,因此 MAX()/MIN()/SUM() 等聚合函数不会改变原始数值,结果完全符合需求:
SELECT * FROM ( SELECT Type, Metric, Value FROM `table` ) PIVOT( MAX(Value) FOR Type IN ('a' AS a, 'b' AS b) -- 替换为实际的 Type 取值列表 ) AS pivoted_table;
若 Type 取值数量不固定,可通过动态 SQL 自动生成列列表(以 BigQuery 为例):
DECLARE type_list STRING; -- 获取所有唯一 Type 值,拼接为 PIVOT 所需格式 SET type_list = ( SELECT STRING_AGG(DISTINCT CONCAT("'", Type, "' AS ", Type), ', ') FROM `table` ); -- 动态执行转置 EXECUTE IMMEDIATE FORMAT(""" SELECT * FROM ( SELECT Type, Metric, Value FROM `table` ) PIVOT( MAX(Value) FOR Type IN (%s) ) AS pivoted_table """, type_list);
方案2:条件聚合(无 PIVOT 关键字)
如果不想使用 PIVOT 语法,可通过条件聚合手动构造目标列,同样因 (Metric, Type) 唯一,聚合操作不会修改数值:
SELECT Metric, MAX(CASE WHEN Type = 'a' THEN Value END) AS a, MAX(CASE WHEN Type = 'b' THEN Value END) AS b -- 按需添加更多 Type 对应的 CASE WHEN 语句 FROM `table` GROUP BY Metric;
动态版本(以 BigQuery 为例):
DECLARE case_statements STRING; SET case_statements = ( SELECT STRING_AGG(DISTINCT CONCAT("MAX(CASE WHEN Type = '", Type, "' THEN Value END) AS ", Type), ', ') FROM `table` ); EXECUTE IMMEDIATE FORMAT(""" SELECT Metric, %s FROM `table` GROUP BY Metric """, case_statements);
内容的提问来源于stack exchange,提问作者zhi
相关产品推荐
相关产品推荐

