Presto SQL中如何基于单列唯一值创建多列实现行转列聚合
Presto SQL 实现固定枚举值行转列聚合
场景说明
原始表结构与样例数据如下:
account_id, campaign_objective, campaign_spend, conversions __________, __________________, ______________, ___________ 1, sales, 100, 25 1, brand, 50, 25 2, sales, 80, 12 2, brand, 60, 12
需要将campaign_objective的枚举值拆分为独立列,按account_id聚合为单条记录,最终输出结构:
account_id, sales, brand, conversions __________, _____, _____, ___________ 1, 100, 50, 25 2, 80, 60, 12
规则要求:
account_id、conversions字段取值保持原有逻辑,每个account_id仅输出1条记录- 每个
campaign_objective枚举值单独成列,对应位置填入该account_id下匹配的campaign_spend值
实现代码
直接使用条件聚合即可实现,Presto原生支持该语法,不需要额外依赖UDF:
SELECT account_id, MAX(CASE WHEN campaign_objective = 'sales' THEN campaign_spend END) AS sales, MAX(CASE WHEN campaign_objective = 'brand' THEN campaign_spend END) AS brand, MAX(conversions) AS conversions FROM 替换为你的实际表名 GROUP BY account_id ORDER BY account_id;
逻辑说明
- 核心逻辑是通过
CASE WHEN先把不同objective的spend值打散到对应列,非匹配行返回null,再用聚合函数提取有效值 - 这里用
MAX()作为聚合函数的原因:同一个account_id下每个objective仅对应1条spend记录,聚合时MAX会自动忽略null值,直接取到唯一的有效spend;如果后续业务调整为同account同objective存在多条spend需要累加,把MAX替换为SUM即可 - conversions字段用MAX包裹是满足SQL GROUP BY的语法要求:GROUP BY维度外的字段必须包裹在聚合函数中,从样例数据看同一个account_id下conversions值完全一致,用MAX/MIN/任意聚合函数都能拿到正确结果,不会出现数值偏差
- 如果后续新增
campaign_objective枚举值,只需要按照相同的CASE WHEN格式新增对应列即可
内容的提问来源于stack exchange,提问作者jbuddy_13
相关产品推荐
相关产品推荐

