【问题标题】:Calculating median with Group By in AWS Redshift在 AWS Redshift 中使用 Group By 计算中位数
【发布时间】:2015-04-14 22:41:31
【问题描述】:

我见过other posts about using the median() window function in Redshift,但是你会如何将它与最后有 group by 的查询一起使用?

例如,假设餐桌课程:

Course | Subject | Num_Students
-------------------------------
   1   |  Math   |      4
   2   |  Math   |      6
   3   |  Math   |      10
   4   | Science |      2
   5   | Science |      10
   6   | Science |      12

我想获得每个课程科目的学生人数中位数。我将如何编写一个给出以下结果的查询:

  Subject  | Median
-----------------------
 Math      |     6
 Science   |     10

我试过了:

SELECT
subject, median(num_students) over ()
FROM
course
GROUP BY 1
;

但它列出了主题的每次出现以及主题中相同的中位数,例如(这是假数据,因此它返回的实际值不是 6,而只是显示所有主题中的相同):

  Subject  | Median
-----------------------
 Math      |     6
 Math      |     6
 Math      |     6
 Science   |     6
 Science   |     6
 Science   |     6

【问题讨论】:

    标签: group-by amazon-redshift window-functions


    【解决方案1】:

    以下内容将为您提供您正在寻找的结果:

    SELECT distinct
    subject, median(num_students) over(partition by Subject) 
    FROM
    course
    order by Subject;
    

    【讨论】:

      【解决方案2】:

      您只需要删除它的“over()”部分。

      SELECT subject, median(num_students) FROM course GROUP BY 1;
      

      【讨论】:

      • 这个答案和@isaac.hazan 的答案都是正确的。这个答案使用了简单的 median() 函数,而 isaac.hazan 的使用了中值窗口函数(这在更复杂的场景中很有用)
      【解决方案3】:

      您尚未在窗口中定义分区。你需要OVER(PARTITION BY subject) 而不是OVER()。

      【讨论】:

      • 感谢 Jakub 的提示。当我这样做时,它说我需要按 num_students 分组。当我这样做时,它确实为每个主题提供了不同的中位数,但同一个主题出现多次而不是一次......
      • @clavid 删除 GROUP BY 并使用 DISTINCT 或使用子查询来计算外部查询中的中位数和分组。
      【解决方案4】:

      假设您要按主题计算其他聚合,例如 avg(), 你需要使用子查询:

      WITH subject_numstudents_medianstudents AS (
          SELECT
              subject
              , num_students
              , median(num_students) over (partition BY subject) AS median_students
          FROM
              course
      )
      SELECT
          subject
          , median_students
          , avg(num_students) as avg_students
      FROM subject_numstudents_medianstudents
      GROUP BY 1, 2
      

      【讨论】:

        猜你喜欢
        • 2014-01-24
        • 1970-01-01
        • 2021-07-01
        • 2021-08-24
        • 1970-01-01
        • 2010-10-13
        • 2020-07-09
        • 2012-06-15
        • 1970-01-01
        相关资源
        最近更新 更多