您好,登錄后才能下訂單哦!
這篇文章主要為大家分析了SQL怎么計算每個分組的中位數的相關知識點,內容詳細易懂,操作細節合理,具有一定參考價值。如果感興趣的話,不妨跟著跟隨小編一起來看看,下面跟著小編一起深入學習“SQL怎么計算每個分組的中位數”的知識吧。
中位數是指一組數據排序以后,位于中間位置的數據值。如果數據個數是奇數,中位數就是最中間位置那個值;如果是偶數,則是中間位置那兩個數的平均值。
怎么查詢出數據分組以后每個組的中位數呢?
用SQL來解決這個問題是很有難度的!
SQL的集合是無序的,沒有數據位置的概念,需要人為地造出行號,但是要對各分組獨立編行號也困難。后來在SQL2003標準中加入了窗口函數,可以對分組編行號了,但是求各組中位數依然繁瑣。
舉個例子:現有成績表SCORES數據如下,要求查出每科成績的中位數。
COURSE | SCORE |
History | 68.5 |
History | 79.0 |
History | 82.5 |
History | 88.0 |
History | 93.5 |
Maths | 75.5 |
Maths | 83.0 |
Maths | 85.0 |
Maths | 95.5 |
查詢出來的各科成績中位數應該是:
COURSE | SCORE |
History | 82.5 |
Maths | 84.0 |
以Oracle為例,用SQL寫出來是這樣:
WITH A AS
( SELECT COURSE, SCORE,
ROW_NUMBER()OVER ( PARTITION BY COURSE ORDER BY SCORE) AS RN,
COUNT(*) OVER (PARTITION BY COURSE) AS CNT
FROM SCORES ),
B AS
(SELECT * FROM A WHERE RN>(CNT-0.5)/2 AND RN<(CNT+2.5)/2 )
SELECT COURSE, AVG(SCORE) AS SCORE FROM B
GROUP BY COURSE
ORDER BY COURSE;
這里的A為每組數據加上組內行號并統計每組記錄數,B查出位于每組中間位置的記錄,最后從B里算出每組平均值,即為中位數。解題步驟比較多,這種SQL不好寫。另外還有不用窗口函數的辦法,語句就更加復雜了,這里不再列出。
集算器的SPL語言支持組內運算,也提供了中位數函數,解決這個問題就會簡單很多,只需1行代碼:
connect("mydb").query("select * from scores order by course, score").group(COURSE).new(~.COURSE,~.(SCORE).median():SCORE)
關于“SQL怎么計算每個分組的中位數”就介紹到這了,更多相關內容可以搜索億速云以前的文章,希望能夠幫助大家答疑解惑,請多多支持億速云網站!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。