"median"列の中央値を取得する必要があります。どのようなアイデアをしてください?中央値を抽出するには?
SELECT
MIN(score) min, CAST(AVG(score) AS float) median, MAX(score) max
FROM result JOIN student ON student.id = result.student_id
"median"列の中央値を取得する必要があります。どのようなアイデアをしてください?中央値を抽出するには?
SELECT
MIN(score) min, CAST(AVG(score) AS float) median, MAX(score) max
FROM result JOIN student ON student.id = result.student_id
私は最も簡単な方法は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()
の違いは、偶数の値があるとどうなりますか。少量のデータがない限り、それは通常は重要ではありません。
ありがとうございます。私はそのような機能が存在することを知らない(PERCENTILE_COUNT)。 – nikita100k
平均は中央値ではない、そうです。あなたがと、それを正確な方法を行うことができ :これは、上下50%の間の境界は、2つの値の間に入る場合を扱う
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
。それらの中間点を中央値として任意に取る。若干高いか低いかに重み付けされるかもしれないという議論がありますが、その区間の値によって人口は正しく2つに分けられます。
それとも、あなたが双曲線分布を扱っている場合は、ショートカット近似があります:
SELECT SQRT(SUM(num)/SUM(1.0/num)) FROM List
他の多くの実世界の分布はほとんどないメンバーといくつかの大規模なメンバーの多くを持っています。 SAVEを押して以前の答えを見ていれば、SQL2003ではもっと簡単なものが得られます:-)
[Sql Serverの中央値を計算する関数](http://stackoverflow.com/questions/1342898/) function-to-calculate-median-in-sql-server) –
ご使用のデータベースに質問にタグを付けてください。 –
申し訳ありません。私はPostgreSQL 9.6を使用しています – nikita100k