目錄
背景
業務背景
思考
效果
首頁 資料庫 mysql教程 MySQL怎麼實作查詢分位值

MySQL怎麼實作查詢分位值

May 27, 2023 pm 04:36 PM
mysql

背景

分位值的概念

在統計和資料分析中,分位數(或四分位數)常用來描述資料分佈的統計特徵。一般情況下,分位數值分成四個等份,分別為第一分位數(Q1)、第二分位數(Q2)(也就是中位數)、第三分位數(Q3)以及極差(IQR)。其中,1/4的資料小於第一分位數,1/4的資料大於第三分位數,中間50%的資料處於第一分位數和第三分位數之間。在統計學中,第一分位數是指將一組資料依照大小順序排列後,處於整個數列中最前面的25%位置的數;第二分位數是指一組資料依大小順序排列之後,處於中間位置的那個數;而第三分位數是指將一組資料依照大小順序排列後,處於整個數列中最靠後的25%位置的數。中位數是第二分位數。在資料分析中,分位值可以幫助我們了解資料分佈情況以及透過分位值來判斷資料是否偏向一側或分散程度等問題。當資料分配不均勻的時候,分位值可以更準確的表現數據的差異。

業務背景

商家發放的優惠券的面額分佈區間是[1, 20],每張優惠券都會被標記其對應的面額。要精確控制券的成本,必須即時了解券的發放情況,以便進行比較準確的評估。對券的發放量、發券金額平均值、以及發放金額分位值(了解不同區間發放金額均值)進行即時的監控,就可以比較清楚的了解券的發放情況。

目前,業務梳理出以下指標需要數據的同學提供,所有指標均以分鐘為統計粒度:

發放量:發券總量

發券金額平均數:發放總額/發放總量

發券金額0.1分位數平均值:每分鐘發券金額依面額大小排序,面額大的在前,面額小的在後,計算每分鐘發券金額前佔比10%的那部分券的平均值[如,發券面額排序為:10,9,8,8,6,5,4,4,2,2,那麼0.1分位數平均值就是10]

發券金額0.2分位數平均值:每分鐘發券金額依面額大小排序,面額大的在前,面額小的在後,計算每分鐘發券金額靠前佔20%的那部分券的平均數[如,發券面額排序為:10,9,8,8,6,5,4,4,2,2,則0.2分位數平均值就是(10 9)/2=9.5]

發放量和發券金額平均值這類指標都可以用MySQL實現,那麼如何實現使用MySQL查詢分位值呢?

思考

MySQL實作排序

row_number() over ( partition by a1.min order by metric_value desc) as orderNum
登入後複製

metric_value表示發券金額,透過以上函數即可實現依照發券金額排序,而且是每分鐘的發券資料依照金額排序

MySQL實作topN

SELECT * FROM sales ORDER BY amount DESC LIMIT 10;
登入後複製

很明顯,這種topN方式並不能實現按分鐘排序,取前N%。為了知道N%的數量,我們需要先確定總量,因此我們需要先計算每分鐘的總量。然後再乘以N%,就知道我們需要擷取N%有多少資料了。

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
登入後複製

然後,我們再把統計結果乘以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
登入後複製

這樣就可以透過比較cn(計算分位值所需的資料量)和orderNum(目前券按面額大小排序所在順序)的大小來取得得到前N%的數據,然後對這部分數據做avg處理,就能得到分位值數據。

調整計算邏輯融合到一起就可以得到分位值的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
登入後複製

This data is within the range of calculating percentile value statistics if cn > orderNum.。為了計算0.1分位值,需要收集每分鐘發券資料的前10%。依照面額排序,分鐘分組後,每筆記錄都會標記此記錄排在第幾。每分鐘發券總量再乘以10%得到cnt,這個值就是計算這一分鐘0.1分鐘均值的所需數據量,當cnt

  • 說明 在使用MySQL實作計算分位值之前,分位值一直都是透過Java程式查詢每分鐘的發券數據,然後排序計算均值實現。透過程式實現最大的問題是,如果發券量比較大,那麼要查詢一段時間的分位值指標,這會對程式帶來極大的壓力。事實上,我們在實際的業務上也確實存在這個問題。每次查詢2小時的分位值數據,就會出現超百萬的數據被載入到Java程式中,這對數據查詢服務來說是極為可怕的。為了解決這個問題,我們必須透過MySQL的方式來實現分位值的查詢。

效果

由程式查詢明細資料計算分位值--> MySQL實作直接查詢分位值

效能從>1min --> 15s以內;性能大幅提升

以上是MySQL怎麼實作查詢分位值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mysql:簡單的概念,用於輕鬆學習 mysql:簡單的概念,用於輕鬆學習 Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

phpmyadmin怎麼打開 phpmyadmin怎麼打開 Apr 10, 2025 pm 10:51 PM

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

MySQL:世界上最受歡迎的數據庫的簡介 MySQL:世界上最受歡迎的數據庫的簡介 Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

為什麼要使用mysql?利益和優勢 為什麼要使用mysql?利益和優勢 Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

redis怎麼使用單線程 redis怎麼使用單線程 Apr 10, 2025 pm 07:12 PM

Redis 使用單線程架構,以提供高性能、簡單性和一致性。它利用 I/O 多路復用、事件循環、非阻塞 I/O 和共享內存來提高並發性,但同時存在並發性受限、單點故障和不適合寫密集型工作負載的局限性。

MySQL和SQL:開發人員的基本技能 MySQL和SQL:開發人員的基本技能 Apr 10, 2025 am 09:30 AM

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

MySQL的位置:數據庫和編程 MySQL的位置:數據庫和編程 Apr 13, 2025 am 12:18 AM

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

怎樣建立sql數據庫 怎樣建立sql數據庫 Apr 09, 2025 pm 04:24 PM

構建 SQL 數據庫涉及 10 個步驟:選擇 DBMS;安裝 DBMS;創建數據庫;創建表;插入數據;檢索數據;更新數據;刪除數據;管理用戶;備份數據庫。

See all articles