我需要在「中值」列中獲得中值。有什麼想法嗎?如何提取中值?
SELECT
MIN(score) min, CAST(AVG(score) AS float) median, MAX(score) max
FROM result JOIN student ON student.id = result.student_id
我需要在「中值」列中獲得中值。有什麼想法嗎?如何提取中值?
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
平均數不是中位數,你是對的。 你可以做到這一點的具體的方式,與:
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現在給你更簡單:-)
可能重複的[功能來計算在Sql服務器中位數](http://stackoverflow.com/questions/1342898/函數計算中位數在SQL服務器) –
請用您正在使用的數據庫標記您的問題。 –
對不起。我正在使用PostgreSQL 9.6 – nikita100k