You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:39:22