2017-04-15 16 views
1

我需要在「中值」列中獲得中值。有什麼想法嗎?如何提取中值?

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服務器中位數](http://stackoverflow.com/questions/1342898/函數計算中位數在SQL服務器) –

+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

平均數不是中位數,你是對的。 你可以做到這一點的具體的方式,與:

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 

其他許多現實世界的分佈有很多小成員和幾大成員。 剛剛擊中保存,並看到了以前的答案:是的,SQL2003現在給你更簡單:-)