我需要在列#34;中位数"中获得中值。有什么想法吗?
SELECT
MIN(score) min, CAST(AVG(score) AS float) median, MAX(score) max
FROM result JOIN student ON student.id = result.student_id
答案 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现在给你一些更简单的东西: - )