【问题标题】:Calculate Mode() in Athena using group by使用 group by 在 Athena 中计算 Mode()
【发布时间】:2021-07-01 01:04:48
【问题描述】:

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

subject, marks

假设它有以下条目

(maths,90),(maths,90),(maths,80),(english,30),(english,30),(english,10)

我希望在“标记”列上计算 Mode(),这样

(maths,90),(english,30) is the output

无法在互联网上为 AWS Athena 找到相同的方法。 任何帮助表示赞赏!

【问题讨论】:

    标签: sql amazon-web-services group-by statistics amazon-athena


    【解决方案1】:

    使用内置的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),
      ('maths',80),
      ('english',30),
      ('english',30),
      ('english',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,第二个元素)

    【讨论】:

      【解决方案2】:

      这个查询应该会给你想要的结果:

      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, marksFrequency, ranking
      

      【讨论】:

        猜你喜欢
        • 2018-01-13
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 2013-05-31
        相关资源
        最近更新 更多