Presto SQL需求:聚合user_data表的结果列与目标列
Presto SQL 解决方案:处理user_data表的聚合需求
首先明确表结构:user_data包含三列,user(用户ID)、target(目标标识)、result(MAP类型,存储键值对数据)。
输出1:按用户统计每个结果键对应的唯一Target数量
这个需求需要先拆分MAP的键,再统计每个键对应的唯一target数量,最后重新聚合为MAP:
SELECT user, MAP_AGG(key, count_target) AS result FROM ( -- 拆分每个result中的键,并按用户+键分组统计唯一target数量 SELECT user, UNNEST(map_keys(result)) AS key, COUNT(DISTINCT target) AS count_target FROM user_data GROUP BY user, key ) t GROUP BY user ORDER BY user;
逻辑说明:
UNNEST(map_keys(result)):把result这个MAP里的所有键(比如A、B、C)拆成单独的行,每个键对应原行的user和target。- 内层分组
GROUP BY user, key:统计每个用户下,每个结果键对应的唯一target数量。 MAP_AGG(key, count_target):把每个用户的所有键和对应的数量重新组装成MAP,得到最终格式。
输出2:按用户聚合每个结果键对应的Target列表
类似逻辑,但改为收集target的唯一列表:
SELECT user, MAP_AGG(key, target_list) AS result FROM ( -- 拆分result的键,收集每个用户+键对应的唯一target列表 SELECT user, UNNEST(map_keys(result)) AS key, ARRAY_AGG(DISTINCT target ORDER BY target) AS target_list FROM user_data GROUP BY user, key ) t GROUP BY user ORDER BY user;
逻辑说明:
ARRAY_AGG(DISTINCT target ORDER BY target):收集每个用户+键对应的唯一target,并用ORDER BY让列表有序(可选,按需调整)。- 同样用
MAP_AGG把键和列表组装成MAP。
合并输出:同时包含两个结果列
将前两个查询的结果通过user关联,得到合并后的表:
SELECT t1.user, t2.result AS result_1, -- 对应输出2的列表结果 t1.result AS result_2 -- 对应输出1的统计结果 FROM ( -- 输出1的查询逻辑 SELECT user, MAP_AGG(key, count_target) AS result FROM ( SELECT user, UNNEST(map_keys(result)) AS key, COUNT(DISTINCT target) AS count_target FROM user_data GROUP BY user, key ) t GROUP BY user ) t1 JOIN ( -- 输出2的查询逻辑 SELECT user, MAP_AGG(key, target_list) AS result FROM ( SELECT user, UNNEST(map_keys(result)) AS key, ARRAY_AGG(DISTINCT target ORDER BY target) AS target_list FROM user_data GROUP BY user, key ) t GROUP BY user ) t2 ON t1.user = t2.user ORDER BY t1.user;
逻辑说明:
把前两个查询分别作为子查询t1和t2,通过user字段关联,将两个结果列放在同一张表中。
内容的提问来源于stack exchange,提问作者junwoong yoon
相关产品推荐
相关产品推荐

