如何提取中值?

时间:2017-04-15 20:09:10

标签: sql postgresql

我需要在列#34;中位数"中获得中值。有什么想法吗?

SELECT
MIN(score) min, CAST(AVG(score) AS float) median, MAX(score) max
FROM result JOIN student ON student.id = result.student_id

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是PERCENTILE_CONT()PERCENTILE_DISC()

SELECT MIN(score) as min_score,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY score) as median_score,
       MAX(score) max_score
FROM result r JOIN
     student s
     ON s.id = r.student_id;

这(合理地)假设score是数字。

PERCENTILE_CONT()PERCENTILE_DISC()之间的区别是当存在偶数个值时会发生的情况。这通常是一个不重要的考虑因素,除非您有少量数据。

答案 1 :(得分:1)

平均值不是中位数,你是对的。 您可以通过以下方式完成此操作:

SELECT (  (SELECT MIN(score) FROM Results X
           WHERE (SELECT COUNT(*) FROM Results Y WHERE Y.score<= X.score)
                  >= (SELECT COUNT(*) FROM Results ) / 2)
        + (SELECT MAX(num) FROM Results X
           WHERE (SELECT COUNT(*) FROM Results Y WHERE Y.score >= X.score)
                  >= (SELECT COUNT(*) FROM Results ) / 2)
       ) / 2 AS median

这处理上下50%之间的边界落在两个值之间的情况;它任意地将它们之间的中间点作为中位数。有些论据可能会略微加权或更低,但该区间中的任何值都正确地将人口分成两部分。

或者,如果你正在处理双曲线分布,那么就有一个快捷方式:

SELECT SQRT(SUM(num) / SUM(1.0/num)) FROM List

许多其他真实世界的发行版都有很多小成员和一些大成员。 刚刚点击SAVE并看到了之前的答案:是的,SQL2003现在给你一些更简单的东西: - )