SQL Presto聚合含字典的列:两种输出需求技术求助
Presto SQL 聚合查询方案
数据表结构与示例数据
user | target | result ----------------------------- 1 | b | {A: 1} 2 | a | {C: 2} 1 | c | {A: 2, B: 3} 2 | d | {A: 1} 1 | d | {C: 4}
输出1:忽略target,按user聚合字典值(key对应数值求和)
需求说明
忽略target字段,按user分组,将result字典中相同key的数值求和,最终聚合成新的字典。
Presto SQL 查询语句
SELECT user, map_agg(key, sum_value) AS result FROM ( -- 拆分字典为key-value行,按user+key求和 SELECT user, entry.key AS key, SUM(entry.value) AS sum_value FROM user_data CROSS JOIN UNNEST(result) AS entry(key, value) GROUP BY user, key ) t GROUP BY user;
关键函数说明
UNNEST(result):将字典类型的result字段拆分为多行,每行对应一个key-value对。SUM(entry.value):对同一user同一key的数值求和。map_agg(key, sum_value):将分组后的key和求和值重新聚合成字典。
输出2:按user聚合,收集每个key对应的target列表
需求说明
按user分组,将result字典中每个key对应的target值收集为数组,最终聚合成新的字典。
Presto SQL 查询语句
SELECT user, map_agg(key, target_list) AS result FROM ( -- 拆分字典后,按user+key收集target为数组 SELECT user, entry.key AS key, ARRAY_AGG(target) AS target_list FROM user_data CROSS JOIN UNNEST(result) AS entry(key, value) GROUP BY user, key ) t GROUP BY user;
关键函数说明
UNNEST(result):拆分字典为key-value行,关联对应的target字段。ARRAY_AGG(target):将同一user同一key对应的所有target值收集为数组。map_agg(key, target_list):将分组后的key和数组重新聚合成字典。
内容的提问来源于stack exchange,提问作者junwoong yoon
相关产品推荐
相关产品推荐

