如何解决使用 group by 计算 Athena 中的 Mode()
subject,marks
假设它有以下条目
(maths,90),(maths,80),(english,30),10)
我希望在“标记”列上计算 Mode() 使得
(maths,30) is the output
在 Internet 上找不到与 AWS Athena 相同的方法。 任何帮助表示赞赏!
解决方法
这个查询应该给你你想要的结果:
WITH ModeRankCTE AS
(
SELECT
subject,marks,COUNT(*) AS marksFrequency,DENSE_RANK() OVER (PARTITION BY subject ORDER BY COUNT(*) DESC) as ranking
FROM A
GROUP BY subject,marks
)
SELECT
subject,MIN(marks) AS highestMark,marksFrequency,ranking
FROM ModeRankCTE
WHERE ranking = 1
GROUP BY subject,ranking
,
使用内置的 histogram 函数有一种更简洁的方法来实现:
SELECT subject,map_keys(histogram(marks))[
array_position(
map_values(histogram(marks)),array_max(map_values(histogram(marks)))
)] as mode
FROM (
VALUES
('maths',90),('maths',80),('english',30),10)
) AS t(subject,marks)
GROUP BY subject;
说明:
-
histogram(marks) 返回地图,例如
{10=1,30=2}
for 'english' -
map_values 返回值数组
[1,2]
-
array_max 返回数组
2
的最大值
-
array_position 返回最大值的位置(
2
,第二个元素) -
map_keys 返回键数组
[10,30]
- 最后[]返回上面位置的元素(
30
,第二个元素)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。