我正在使用histogram()
函数https://prestodb.github.io/docs/current/functions/aggregate.html
“返回包含每个输入值出现次数的计数的映射。”
结果可能看起来像这样:
{ORANGES=1, APPLES=165, BANANAS=1}
是否有一个函数会根据上述输入返回APPLES
?
XY问题?
机敏的读者可能会注意到histogram()
的最终结果与我正在尝试做的事情相结合,将等同于教科书中存在的神话般的 Mode Function (模式功能)在实际的数据库引擎中。
这是我目前完整的查询。我正在为每个upper(cmplx)
元组寻找upper(address),zip
最频繁出现的值:
select * from (select upper(address) as address, zip,
(SELECT max_by(key, value)
FROM unnest(histogram(upper(cmplx))) as t(key, value)),
count(*) as N
from apartments
group by upper(address), zip) t1
where N > 3
order by N desc;
还有错误...
SYNTAX_ERROR:第2:55行:常量表达式不能包含列 参考
答案 0 :(得分:1)
您可以使用map_entries将从map
获得的histogram
转换为数组。然后,您可以UNNEST将该数组建立为关系,然后可以调用max_by。请参见以下示例:
SELECT max_by(key, value) FROM (
SELECT map_entries(histogram(clerk)) as entries from tpch.tiny.orders
)
CROSS JOIN UNNEST (entries) t(key, value);
编辑:
如@Alex R所述,您还可以将histogram
的结果直接传递给UNNEST
:
SELECT max_by(key, value) FROM (
SELECT histogram(clerk) as histogram from tpch.tiny.orders )
CROSS JOIN UNNEST (histogram) t(key, value);
在您的问题中,查询部分(SELECT max_by(key, value) FROM unnest(histogram(upper(cmplx))
是尚不支持的相关子查询。但是,您看到的错误是令人误解的。 IIRC Athena使用的是Presto 0.172,此错误报告已在0.183中修复(请参见https://docs.starburstdata.com/latest/release/release-0.183.html-在2017年7月,在0.183中还添加了btw map_entries
)
答案 1 :(得分:1)
这是我用来从任意映射中获取与最大值对应的键的方法:
setVertexBuffer:...
将直方图地图替换为“地图名称”。
不确定该解决方案在计算上与其他答案相比如何,但是我确实更容易阅读。