【问题标题】:Calculating the median amongst groups of rows (SQL)计算行组中的中位数 (SQL)
【发布时间】:2019-11-28 08:18:10
【问题描述】:

我有一个包含考试结果的关系数据库,但我需要的查询只使用一个表:

  • Results_tbl = student_no INT,
  • subject_code VARCHAR(5),
  • 分数浮动,
  • 日期日期

我需要查询来计算每个科目参加考试的学生的中位数(考虑到每个科目的学生超过 1 次考试),然后显示哪个科目的中位数最高。

我在 SQL(元数据库)上计算中位数的知识非常有限,我从使用 result_table.student_no count(*) 函数和 GROUP BY results_tbl.subject_code 开始,但我觉得这不是合适的方法

对于表中我需要的每个主题代码

例如。

# OF STUDENT WHO SAT EXAM = _ _ _ & MEDIAN # OF STUDENTS = _ _

(按 DESC 排序)

【问题讨论】:

  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,不是特定数据库产品的名称(而Metabase只是数据库的前端,不是数据库本身)请为您正在使用的数据库产品添加tag

标签: sql median metabase


【解决方案1】:

鉴于您之前的问题是用 SQL Server 标记的,我假设这就是您正在使用的。在这种情况下,您可以使用 PERCENTILE_CONT()PERCENTILE_DISC()

例如

SELECT  t.Col,
        Median_Cont = PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY t.Col) OVER(),
        Median_Disc = PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY t.Col) OVER()
FROM    (VALUES (1), (2), (3), (4)) AS t (Col);

给予:

Col     Median_Cont     Median_Disc
--------------------------------------
1       2.5             2
2       2.5             2
3       2.5             2
4       2.5             2

或者为了限制你的结果,你需要一个子查询:

SELECT  t.Col
FROM    (   SELECT  t.Col,
                    Median_Disc = PERCENTILE_DISC(0.5) 
                                    WITHIN GROUP(ORDER BY t.Col) OVER()
            FROM    (VALUES (1), (2), (3), (4)) AS t (Col)
        ) AS t
WHERE   t.Col = t.Median_Disc;

结果

Col
-----
2

对于您的具体示例,我认为您还需要包含 PARTITION BY 以确保每个主题计算中位数:

SELECT  r.subject_code, r.score, r.Date
FROM    (   SELECT  r.*,
                    Median = PERCENTILE_DISC(0.5) 
                                    WITHIN GROUP(ORDER BY r.Score) 
                                    OVER(PARTITION BY r.Subject_Code)
            FROM    Results_tbl AS r
        ) AS r
WHERE   r.Score = r.Median;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2010-11-23
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多