最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL實(shí)現(xiàn)查詢(xún)分位值的示例代碼

 更新時(shí)間:2023年04月24日 08:51:41   作者:汪汪隊(duì)倒大霉  
本文主要介紹了MySQL實(shí)現(xiàn)查詢(xún)分位值的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

背景

分位值的概念

分位值:分位值(Quartile)是一種用于描述數(shù)據(jù)分布的統(tǒng)計(jì)概念,在統(tǒng)計(jì)學(xué)和數(shù)據(jù)分析中經(jīng)常被用到。一般情況下,分位值分成四個(gè)等份,分別為第一分位數(shù)(Q1)、第二分位數(shù)(Q2)(也就是中位數(shù))、第三分位數(shù)(Q3)以及極差(IQR)。其中,1/4的數(shù)據(jù)小于第一分位數(shù),1/4的數(shù)據(jù)大于第三分位數(shù),中間50%的數(shù)據(jù)處于第一分位數(shù)和第三分位數(shù)之間。 在統(tǒng)計(jì)學(xué)中,第一分位數(shù)是指將一組數(shù)據(jù)按照大小順序排列后,處于整個(gè)數(shù)列中最靠前的25%位置的數(shù);第二分位數(shù)是指一組數(shù)據(jù)按大小順序排列后,處于中間位置的那個(gè)數(shù);而第三分位數(shù)是指將一組數(shù)據(jù)按照大小順序排列后,處于整個(gè)數(shù)列中最靠后的25%位置的數(shù)。中位數(shù)是第二分位數(shù)。 在數(shù)據(jù)分析中,分位值可以幫助我們了解數(shù)據(jù)分布情況以及通過(guò)分位值來(lái)判斷數(shù)據(jù)是否偏向一側(cè)或者分散程度等問(wèn)題。當(dāng)數(shù)據(jù)分配不均勻的時(shí)候,分位值可以更準(zhǔn)確的表現(xiàn)數(shù)據(jù)的差異。

業(yè)務(wù)背景

商家活動(dòng)發(fā)券面額有一個(gè)分布區(qū)間[1, 20],每發(fā)一張券就都會(huì)標(biāo)記對(duì)應(yīng)券的面額。如何比較準(zhǔn)確的控制券的成本,就需要實(shí)時(shí)對(duì)這些券的發(fā)放情況做一個(gè)比較準(zhǔn)確的了解。對(duì)券的發(fā)放量、發(fā)券金額均值、以及發(fā)放金額分位值(了解不同區(qū)間發(fā)放金額均值)進(jìn)行實(shí)時(shí)的監(jiān)控,就可以比較清楚的了解券的發(fā)放情況。

目前,業(yè)務(wù)梳理出如下指標(biāo)需要數(shù)據(jù)的同學(xué)提供,所有指標(biāo)均以分鐘為統(tǒng)計(jì)粒度:

發(fā)放量:發(fā)券總量

發(fā)券金額均值:發(fā)放總額/發(fā)放總量

發(fā)券金額0.1分位均值:每分鐘發(fā)券金額按照面額大小排序,面額大的在前,面額小的在后,計(jì)算每分鐘發(fā)券金額靠前占比10%的那部分券的均值[如,發(fā)券面額排序?yàn)椋?0,9,8,8,6,5,4,4,2,2,那么0.1分位均值就是10]

發(fā)券金額0.2分位均值:每分鐘發(fā)券金額按照面額大小排序,面額大的在前,面額小的在后,計(jì)算每分鐘發(fā)券金額靠前占比20%的那部分券的均值[如,發(fā)券面額排序?yàn)椋?0,9,8,8,6,5,4,4,2,2,那么0.2分位均值就是(10+9)/2=9.5]

發(fā)放量和發(fā)券金額均值這類(lèi)指標(biāo)都可以用MySQL實(shí)現(xiàn),那么如何實(shí)現(xiàn)使用MySQL查詢(xún)分位值呢?

思考

MySQL實(shí)現(xiàn)排序

row_number() over ( partition by a1.min order by metric_value desc) as orderNum 

metric_value表示發(fā)券金額,通過(guò)以上函數(shù)即可實(shí)現(xiàn)按照發(fā)券金額排序,而且是每分鐘的發(fā)券數(shù)據(jù)按照金額排序

MySQL實(shí)現(xiàn)topN

SELECT * FROM sales ORDER BY amount DESC LIMIT 10; 

很明顯,這種topN方式并不能實(shí)現(xiàn)按分鐘排序,取前N%。那我們換個(gè)思路,因?yàn)槲覀円戎揽偭浚拍苤繬%有多大,所以我們需要先計(jì)算出每分鐘總量。然后再乘以N%,就知道我們需要提取N%有多少數(shù)據(jù)了。

select hour,min, count(1) as cn 
from table  
where dt=20230423 and hour=11 and min>=0 and min<=30 
group by hour,min

然后,我們?cè)侔呀y(tǒng)計(jì)結(jié)果乘以N%

select dt,a2.hour,a2.min as min,metric_value, round(cn*N%) as cn, orderNum 
from ( 
	select dt,hour,a1.min as min, 
	metric_value, row_number() over ( partition by a1.min order by metric_value desc) as orderNum 
	from table a1 
	where dt=20230423 and hour=11 and min>=0 and min<=30 
	) as a2 
inner join ( 
	select hour,min , count(1) as cn 
	from table c 
	where dt=20230423 and hour=11 and min>=0 and min<=30  
	group by hour,min ) a3
on a2.hour=a3.hour and a2.min=a3.min

這樣就可以通過(guò)比較cn(計(jì)算分位值所需要的數(shù)據(jù)量)和orderNum(當(dāng)前券按面額大小排序所在順序)的大小來(lái)獲取得到前N%的數(shù)據(jù),然后對(duì)這部分?jǐn)?shù)據(jù)做avg處理,就能得到分位值數(shù)據(jù)。

調(diào)整計(jì)算邏輯融合到一起就可以得出分位值的SQL如下:

select dt,hour,min, round(avg(metric_value)) as metric_value 
from ( 
	select dt,a2.hour,a2.min as min,metric_value, round(cn*?) as cn, orderNum 
from ( 
	select dt,hour,a1.min as min,
	metric_value, row_number() over ( partition by a1.min order by metric_value desc) as orderNum 
	from table a1 
	where dt=20230423 and hour=11 and min>=0 and min<=30 
	) as a2 
inner join ( 
	select hour,min, count(1) as cn 
	from table a1 
	where dt=20230423 and hour=11 and min>=0 and min<=30 
	) as a3
on a2.hour=a3.hour and a2.min=a3.min ) as q 
where cn>orderNum 
group by dt,hour,min 
order by dt,hour,min 

cn > orderNum 表示這條數(shù)據(jù)在計(jì)算分位值統(tǒng)計(jì)范圍內(nèi)。如果要計(jì)算0.1分位值,那么需要統(tǒng)計(jì)每分鐘的前10%的發(fā)券數(shù)據(jù)。按照面額排序,分鐘分組后,每條記錄都會(huì)標(biāo)記這條記錄排在第幾。每分鐘發(fā)券總量再乘以10%得到cnt,這個(gè)值就是計(jì)算這一分鐘0.1分鐘均值的所需要數(shù)據(jù)量,當(dāng)cnt<orderNum時(shí),代表超出10%的限制,不再納入統(tǒng)計(jì)0.1分位均值的范圍。這樣就可以實(shí)現(xiàn)過(guò)濾出計(jì)算分位值所需數(shù)據(jù),然后再通過(guò)avg函數(shù)就可以實(shí)現(xiàn)計(jì)算均值。最終結(jié)果也就是分位值的結(jié)果了。

以上就是我在業(yè)務(wù)上遇到計(jì)算分位值指標(biāo),然后通過(guò)MySQL實(shí)現(xiàn)計(jì)算的實(shí)現(xiàn)過(guò)程。

  • 說(shuō)明 在使用MySQL實(shí)現(xiàn)計(jì)算分位值之前,分位值一直都是通過(guò)Java程序查詢(xún)每分鐘的發(fā)券數(shù)據(jù),然后排序計(jì)算均值實(shí)現(xiàn)。通過(guò)程序?qū)崿F(xiàn)最大的問(wèn)題是,如果發(fā)券量比較大,那么要查詢(xún)一段時(shí)間的分位值指標(biāo),這會(huì)對(duì)程序帶來(lái)極大的壓力。事實(shí)上,我們?cè)趯?shí)際的業(yè)務(wù)上也確實(shí)存在這個(gè)問(wèn)題。每次查詢(xún)2個(gè)小時(shí)的分位值數(shù)據(jù),就會(huì)出現(xiàn)超百萬(wàn)的數(shù)據(jù)被加載到Java程序中,這對(duì)數(shù)據(jù)查詢(xún)服務(wù)是極為可怕的。為了解決這個(gè)問(wèn)題,我們必須通過(guò)MySQL的方式來(lái)實(shí)現(xiàn)分位值的查詢(xún)。

效果

由程序查詢(xún)明細(xì)數(shù)據(jù)計(jì)算分位值 --> MySQL實(shí)現(xiàn)直接查詢(xún)分位值

性能從>1min --> 15s以?xún)?nèi);性能得到極大提升

參考

https://geek-docs.com/sql/sql-examples/sql-to-calculate-the-median.html

到此這篇關(guān)于MySQL實(shí)現(xiàn)查詢(xún)分位值的示例代碼的文章就介紹到這了,更多相關(guān)MySQL 查詢(xún)分位值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL讀取my.cnf的順序問(wèn)題詳情

    MySQL讀取my.cnf的順序問(wèn)題詳情

    這篇文章主要介紹MySQL讀取my.cnf的順序問(wèn)題,以mysql.server、mysqld_safe及mysqld和my_print_defaults讀取my.cnf順序展開(kāi)文章介紹主題,感興趣的話大家一起來(lái)學(xué)習(xí)吧
    2021-09-09
  • 如何通過(guò)yum方式安裝mysql數(shù)據(jù)庫(kù)

    如何通過(guò)yum方式安裝mysql數(shù)據(jù)庫(kù)

    部署MySQL數(shù)據(jù)庫(kù)有多種部署方式,常用的部署方式就有三種,yum安裝、rpm安裝以及編譯安裝,這篇文章主要給大家介紹了關(guān)于如何如果通過(guò)yum方式安裝mysql數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • mysql如何執(zhí)行流程

    mysql如何執(zhí)行流程

    MySQL主要分為server層和存儲(chǔ)引擎層,server層負(fù)責(zé)連接、查詢(xún)緩存、分析、優(yōu)化和執(zhí)行,存儲(chǔ)引擎層負(fù)責(zé)數(shù)據(jù)存儲(chǔ)和提取,SQL查詢(xún)執(zhí)行流程包括連接、認(rèn)證、權(quán)限檢查、分析、優(yōu)化和執(zhí)行,更新語(yǔ)句執(zhí)行涉及重做日志(redolog)和歸檔日志(binlog)
    2024-11-11
  • 使用存儲(chǔ)過(guò)程實(shí)現(xiàn)循環(huán)插入100條記錄

    使用存儲(chǔ)過(guò)程實(shí)現(xiàn)循環(huán)插入100條記錄

    本節(jié)主要介紹了使用存儲(chǔ)過(guò)程實(shí)現(xiàn)循環(huán)插入100條記錄的具體實(shí)現(xiàn),需要的朋友可以參考下
    2014-07-07
  • mysql序號(hào)rownum行號(hào)實(shí)現(xiàn)方式

    mysql序號(hào)rownum行號(hào)實(shí)現(xiàn)方式

    這篇文章主要介紹了mysql序號(hào)rownum行號(hào)實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • mysql批量刪除數(shù)據(jù)方法及注意事項(xiàng)說(shuō)明

    mysql批量刪除數(shù)據(jù)方法及注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了mysql批量刪除數(shù)據(jù)方法及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 常見(jiàn)數(shù)據(jù)庫(kù)中SQL分頁(yè)語(yǔ)法整理大全(附示例)

    常見(jiàn)數(shù)據(jù)庫(kù)中SQL分頁(yè)語(yǔ)法整理大全(附示例)

    數(shù)據(jù)庫(kù)分頁(yè)是數(shù)據(jù)庫(kù)管理系統(tǒng)中非常常見(jiàn)的一種操作,主要用于在大量數(shù)據(jù)中進(jìn)行高效的瀏覽,提高用戶體驗(yàn),這篇文章主要介紹了常見(jiàn)數(shù)據(jù)庫(kù)中SQL分頁(yè)語(yǔ)法整理的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù)(最新推薦)

    Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù)(最新推薦)

    這篇文章主要介紹了Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù),實(shí)現(xiàn)原理也很簡(jiǎn)單,mysql刪除重復(fù)數(shù)據(jù),多個(gè)字段分組操作,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • CentOS 7.2下MySQL的安裝與相關(guān)配置

    CentOS 7.2下MySQL的安裝與相關(guān)配置

    最近因?yàn)楣ぷ餍枰?,要在CentOS上安裝MySQL,在安裝的時(shí)候遇到了一點(diǎn)問(wèn)題,花了點(diǎn)時(shí)間解決了,感覺(jué)不管是官網(wǎng)還是網(wǎng)上的一些教程都不夠完整,不能一次性幫新手解決問(wèn)題,于是我就結(jié)合官網(wǎng)和網(wǎng)上的資源整理了下,現(xiàn)在分享給大家,希望對(duì)有需要的朋友們能有所幫助。
    2016-11-11
  • MySQL binlog_ignore_db 參數(shù)的具體使用

    MySQL binlog_ignore_db 參數(shù)的具體使用

    這篇文章主要介紹了MySQL binlog_ignore_db 參數(shù)的具體作用,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-12-12

最新評(píng)論

云浮市| 贡嘎县| 迁安市| 南岸区| 虎林市| 石门县| 和硕县| 固镇县| 武胜县| 永胜县| 宽甸| 瑞安市| 罗平县| 榆树市| 东海县| 潍坊市| 成都市| 三原县| 和林格尔县| 汉川市| 邵阳县| 临高县| 佛山市| 湄潭县| 马龙县| 长垣县| 洛阳市| 松滋市| 永吉县| 昌吉市| 新干县| 桐乡市| 和硕县| 景德镇市| 兰考县| 新巴尔虎右旗| 定陶县| 肥西县| 砚山县| 西乌珠穆沁旗| 府谷县|