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)
SPL 擅長解決這類分組子集和組內有序計算,請閱 、 、
集算器 SPL 是解決 SQL 難題的專業指令碼語言,它語法簡單,符合自然思維,是天然分步、層次清晰的程式導向計算語言。它採用與資料庫無關的統一語法,編寫的演算法可在資料庫間無縫遷移。它是桌面級計算工具,即裝即用,配置簡單,除錯功能完善,可設定斷點、單步執行,每步執行結果都可檢視。請參閱
SPL也能很方便地嵌入到JAVA應用,可參考 。
具體使用方法可參考 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2698402/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL 如何查詢每個分組都出現的欄位值SQL
- 在 MySQL 中,如何計算一組資料的中位數?MySql
- SQL-分組聚合 - 單欄位分組SQL
- mysql 求分組中位數、環比、同比、中位數的環比、同比MySql
- python 計算中位數、四分位數、最大值、最小值等Python
- sql 按著時間分組,每組取 20 條資料SQL
- Giraph原始碼分析(八)—— 統計每個SuperStep中參與計算的頂點數目原始碼
- MySQL百分位數計算(優化版)MySql優化
- mysql 分組取每個組的前幾名的問題MySql
- 1的個數 【位運算】
- Dynamics CRM使用計算欄位自動計算兩個時間欄位的天數差
- MySQL百分位數計算(再優化版)MySql優化
- 如何區分例項化網格中的每個例項
- 計算機中位(bit), 位元組(byte), 字(word)的關係計算機
- sql取每組最新資料SQL
- Python的pandas的Dataframe使用groupby分組並求每組的統計值Python
- SQL 如何在時間序列中根據欄位變化分組SQL
- 統計陣列元素中每個元素出現的次數陣列
- Java中計算兩個日期間的天數Java
- 計算位數最高達300位的兩個非負整數的乘積,C語言程式設計實現C語言程式設計
- 如何從字串文字中拆解出多個數值並計算字串
- HOME: Count Digits —— 計算字串中數字個數Git字串
- MySQL百分位數計算(第三次優化)MySql優化
- 計算機中的二進位制計算機
- mysql 計算 一個文字欄位的內容一個文字出現的次數MySql
- [Java SE] 經典問題:超出Java Long型(8位元組/64位)的二進位制位元流資料如何進行大數的數值計算?Java
- 使用貼現率8%和12%分別計算每個專案的淨現值(NPV)
- 如何計算PHP函式中傳遞的引數數量PHP函式
- 三種語言實現計算二進位制中1的個數(C++/Python/Java)C++PythonJava
- sql server 計算兩個時間 相差的 幾天幾時幾分幾秒SQLServer
- 分塊=-=優雅的暴力=-=中位數模版
- sql中的left切割 與 group by後的兩次分組SQL
- 82. 落單的數 ( 位運算-統計 )
- Linux 中實現按照每一列的類別計算 指定列值的平均數Linux
- MONGODB03 - 分組計數/分組去重計數(基於 spring-data-mongodb)MongoDBSpring
- 在計算機組成原理中x,計算機組成原理計算機
- Java 中,如何計算兩個日期之間的差距?Java
- List分頁(SQL引數化2100個 )SQL