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

如何在AWS Athena SQL中按键对MAP排序?结果异常求助

问题1:AWS Athena中MAP排序结果不符合预期

你的SQL中子查询的order by无法保证array_agg会按该顺序聚合,需要将排序逻辑直接嵌入array_agg函数内部,修正后的代码如下:

SELECT map_from_entries(array_agg(row(a, b) ORDER BY a DESC))
FROM unnest(map(ARRAY['z', 'a', 'b', 'c'], ARRAY[1, 2, 3, 4])) AS t(a, b)

这样array_agg会严格按照a降序聚合键值对,map_from_entries生成的MAP会保留这个顺序,得到你期望的{a=2, b=3, c=4, z=1}。

问题2:Trino中替代map_top_n_keys函数的实现

Trino没有内置的map_top_n_keys,可以通过展开MAP、排序取前N、再聚合的方式实现,示例如下:

假设要从MAP中取出值最大的前2个键:

-- 示例:获取map中值最大的前2个键
WITH data AS (
    SELECT map(ARRAY['z', 'a', 'b', 'c'], ARRAY[1, 2, 3, 4]) AS test_map
)
SELECT array_agg(key ORDER BY value DESC LIMIT 2) AS top_n_keys
FROM data, unnest(test_map) AS t(key, value)

如果需要复用逻辑,可以创建自定义函数:

CREATE OR REPLACE FUNCTION map_top_n_keys(map_arg MAP(VARCHAR, INTEGER), n INTEGER)
RETURNS ARRAY(VARCHAR)
LANGUAGE SQL
AS $$
    SELECT array_agg(key ORDER BY value DESC LIMIT n)
    FROM unnest(map_arg) AS t(key, value)
$$;

-- 使用自定义函数
SELECT map_top_n_keys(map(ARRAY['z', 'a', 'b', 'c'], ARRAY[1, 2, 3, 4]), 2);

注意:自定义函数的参数类型需要根据你的实际MAP类型调整(比如把INTEGER换成DOUBLE等)。

内容的提问来源于stack exchange,提问作者Ramesh Azhakesan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:27:04