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
- Laravel 一條 SQL 如何 count 多個欄位,Laravel 一條 sql 查詢每個分類的數量LaravelSQL
- 計算陣列中每個數字出現的次數陣列
- mysql 求分組中位數、環比、同比、中位數的環比、同比MySql
- 位運算--求一個 數二進位制中1的個數
- 如何統計一列數中每個元素出現的次數
- python 計算中位數、四分位數、最大值、最小值等Python
- 每個月的sql引數配置SQL
- 位運算(一):二進位制中1的個數
- mysql 分組取每個組的前幾名的問題MySql
- sql 按著時間分組,每組取 20 條資料SQL
- Giraph原始碼分析(八)—— 統計每個SuperStep中參與計算的頂點數目原始碼
- MySQL百分位數計算(優化版)MySql優化
- 一種快速統計SQL Server每個錶行數的方法SQLServer
- 0~9十個數,每個數只能使用一次,組成兩個三位數相加和為四位數的演算法演算法
- MySQL百分位數計算(再優化版)MySql優化
- 如何區分例項化網格中的每個例項
- MySQL-取某個欄位表中每組幾行資料方式MySql
- Dynamics CRM使用計算欄位自動計算兩個時間欄位的天數差
- SQL Server 中 ntext 長度如何計算 ?SQLServer
- 計算機中位(bit), 位元組(byte), 字(word)的關係計算機
- Python的pandas的Dataframe使用groupby分組並求每組的統計值Python
- 統計陣列元素中每個元素出現的次數陣列
- SQL分組SQL
- mysql實戰--MYSQL中的SQL分組方法MySql
- SQL 如何在時間序列中根據欄位變化分組SQL
- Oracle按時間分組統計的sqlOracleSQL
- sql取每組最新資料SQL
- 如何從字串文字中拆解出多個數值並計算字串
- 計算組合數 (sdut oj)
- Java中計算兩個日期間的天數Java
- 計算兩個時間日期相差的天數、分鐘數或者秒數
- 每個新手程式設計師必看的 SQL 指南程式設計師SQL
- 簡單Sql語句統計每年每個月的資料,每個月為資料的每列,簡單SQL練習SQL
- 【c語言】統計一個數二進位制中的1的個數C語言
- SQL分組中WHERE和HAVING的異同SQL
- SQL位運算SQL