2017-04-15 16 views
1

"median"列の中央値を取得する必要があります。どのようなアイデアをしてください?中央値を抽出するには?

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

[Sql Serverの中央値を計算する関数](http://stackoverflow.com/questions/1342898/) function-to-calculate-median-in-sql-server) –

+1

ご使用のデータベースに質問にタグを付けてください。 –

+0

申し訳ありません。私はPostgreSQL 9.6を使用しています – nikita100k

答えて

1

私は最も簡単な方法は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()の違いは、偶数の値があるとどうなりますか。少量のデータがない限り、それは通常は重要ではありません。

+0

ありがとうございます。私はそのような機能が存在することを知らない(PERCENTILE_COUNT)。 – nikita100k

0

平均は中央値ではない、そうです。あなたがと、それを正確な方法を行うことができ :これは、上下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ではもっと簡単なものが得られます:-)

関連する問題