如何使用逆分布函数模拟MEDIAN()聚合函数
一些數據庫足夠強大,可以實現MEDIAN()聚合函數。 請記住, MEDIAN()與MEAN()或AVG() (平均)略有不同(并且通常更有用)。
雖然平均值是按SUM(exp) / COUNT(exp) ,但是MEDIAN()告訴您樣本中所有值的50%高于MEDIAN()而集合中的其他50%則小于MEDIAN() MEDIAN() 。
因此,換句話說,如果您執行以下查詢:
…那么平均值和中位數是相同的:
avg median 2 2但是,如果您這樣嚴重扭曲數據:
WITH t(value) AS (SELECT 1 FROM DUAL UNION ALLSELECT 2 FROM DUAL UNION ALLSELECT 100 FROM DUAL ) SELECTavg(value),median(value) FROMt;然后,您的平均值也將出現偏差,而中位數仍將指示樣本中大多數值的位置
avg median 34.333 2上面的示例在統計上當然是微不足道的,但是如果您擁有更多數據,則可以輕松地看到這種影響是戲劇性的且相關的:
圖像許可證CC-BY-SA 3.0。 由Cmglee上傳到Wikipedia
偏斜效應在統計中非常重要,為了對任何事物做出有趣的主張,使用百分位通常比使用平均值更有用。 以一個國家的平均收入與中位數收入為例。 盡管美國(以及許多其他國家/地區) 的平均收入一直在穩定增長, 但在過去十年中 , 中位數收入卻有所下降 。 這是由于財富越來越嚴重地向超級富翁傾斜。
這個博客不是關于政治的,而是關于Java和SQL的,因此讓我們回到計算實際情況。
在SQL中使用分位數
正如我們之前所看到的, MEDIAN()將樣本分為兩個大小相等的組,并在這兩個組之間“取值”。 此特定值也稱為第50個百分位數,因為樣本中所有值的50%都小于MEDIAN() 。 因此,我們可以建立:
- MIN(exp) :0百分位數
- MEDIAN(exp) :第50個百分點
- MAX(exp) :100%
以上所有都是百分位數的特殊情況,盡管所有SQL數據庫(和SQL標準)都支持MIN()和MAX() ,但SQL標準不支持MEDIAN() ,而以下jOOQ數據庫僅支持MEDIAN() :
- BR
- 數據庫
- 甲骨文
- Sybase SQL Anywhere
在SQL標準中,還有另一種計算MEDIAN() ,以及通常計算任何百分位數的方法, 因為PostgreSQL 9.4在PostgreSQL中也使用…
有序集合聚合函數
有趣的是,除了窗口函數外 ,您還可以為某些聚合函數指定ORDER BY子句,這些聚合函數根據有序集聚合數據。
SQL標準percentile_cont函數就是這樣的一個函數,該函數將百分位數作為參數,然后接受一個附加的WITHIN GROUP子句,該子句將ORDER BY子句作為參數。 這些特定的有序集函數也稱為逆分布函數 ,因為我們要查找樣本中所有值的分布中特定百分位數的位置( 如果您不對數學感到恐懼,請查看Wikipedia文章 )
因此,在PostgreSQL 9.4+中,可以像下面這樣模擬MEDIAN()函數:
WITH t(value) AS (SELECT 1 UNION ALLSELECT 2 UNION ALLSELECT 100 ) SELECTavg(value),percentile_cont(0.5) WITHIN GROUP (ORDER BY value) FROMt;這個有趣的語法是標準化的,并且可能由Oracle的LISTAGG()所知,該語法允許將值聚合為串聯的字符串:
WITH t(value) AS (SELECT 1 FROM DUAL UNION ALLSELECT 2 FROM DUAL UNION ALLSELECT 100 FROM DUAL ) SELECTlistagg(value, ', ') WITHIN GROUP (ORDER BY value) FROMt;該查詢簡單地產生:
listagg --------- 1, 2, 100附帶說明一下: LISTAGG()當然是完全沒用的,因為它返回VARCHAR2 ,在Oracle中它再次具有最大長度4000。 無用…
開箱即用的仿真
與往常一樣,jOOQ將開箱即用地模擬這些事情。 您既可以使用DSL.median()函數,也可以使用即將發布的jOOQ 3.6和新的DSL.percentileCont()函數來產生相同的值:
DSL.using(configuration).select(median(T.VALUE),percentileCont(0.5).withinGroupOrderBy(T.VALUE)).from(T).fetch();翻譯自: https://www.javacodegeeks.com/2015/01/how-to-emulate-the-median-aggregate-function-using-inverse-distribution-functions.html
總結
以上是生活随笔為你收集整理的如何使用逆分布函数模拟MEDIAN()聚合函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一款性能足够的4.5寸以下的手机
- 下一篇: 2021最新某某文书列表参数pageId