微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 group by 计算 Athena 中的 Mode()

如何解决使用 group by 计算 Athena 中的 Mode()

我有一个带有架构的表“A”

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 举报,一经查实,本站将立刻删除。