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

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;

逻辑说明:

  1. UNNEST(map_keys(result)):把result这个MAP里的所有键(比如A、B、C)拆成单独的行,每个键对应原行的user和target。
  2. 内层分组GROUP BY user, key:统计每个用户下,每个结果键对应的唯一target数量。
  3. 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;

逻辑说明:

  1. ARRAY_AGG(DISTINCT target ORDER BY target):收集每个用户+键对应的唯一target,并用ORDER BY让列表有序(可选,按需调整)。
  2. 同样用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:46:27