如何在不同的資料平臺取前百分之N的記錄?
導讀 | 最近幫業務部門梳理業務報表,其中有個需求是就算某指標等待時間最長的前百分之十,其實就是對等待時長進行倒序排序後,取結果集的前百分之十。這個需求在SQL Server和Oracle上都很容易實現,甚至是在MySQL 8.0也很容易實現,只是恰好我們業務資料庫是MySQL 5.7。 |
先給大家介紹下不同資料庫平臺的實現方法。
SQL Server實現方法
SQL Server上有個TOP Percent的方法可以直接取結果的前(或後)百分之N。
例如有如下一張City表:
我們取前10%的資料記錄可以這樣寫:
SELECT TOP 10 PERCENT * FROM City ORDER BY ID DESC
結果如下:
Oracle實現方法
Oracle有個ROWNUM偽列可以用來幫助我們計算前百分之N。
ROWNUM偽列的特點:
- ROWNUM是按照記錄插入時的順序排序的。
- ROWNUM並不實際存在,是對篩選後的結果集的一個排序,如果不存在結果集就不會有ROWNUM。
- ROWNUM不能用基表名作為字首。
- 若使用大於號(>),則只能使用(>0),其他均不可以 。
- 若使用小於號(<),同一般情況 。
- 若使用等於號(=),則只能使用等於1(=1)我們可以先計算出整個表的記錄行數量。
在使用ROWNUM進行查詢時,請注意:
SELECT COUNT(*) CNT FROM City
然後根據count聚合查詢總條數乘以百分比,來確定要查詢的條數。
SELECT 0.1*COUNT(*) CNT FROM City
最後取出偽列小於共有資料的百分比的資料。
SELECT * FROM CITY WHERE ID IN ( SELECT ID FROM ( SELECT ID FROM CITY ORDER BY ID DESC ) WHERE ROWNUM < (SELECT COUNT(*)*0.1 FROM CITY)
注意:Oracle不支援子查詢內ORDER BY,需要在外面再巢狀一層。
MySQL 8.0的實現方法
MySQL 8.0的實現方法主要是藉助視窗函式ROW_NUMBER() OVER()。其實就是給排好序的集合新增一個自增長列,與Oracle的ROWNUM有點類似。
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(ORDER BY ID DESC) rn FROM City ORDER BY ID DESC ) a WHERE a.rn<=(SELECT 0.1*COUNT(*) FROM City)
MySQL 5.X的實現方法
我們知道MySQL 5.X是沒有開窗函式ROW_NUMBER() OVER()的,那該如何實現呢?
這裡我們需要藉助變數來實現,其實思路還是建立一個自增長列,只是方法不同。
SELECT A.*, @row_num:=@row_num+1 AS ROW_NUM FROM City A , (SELECT @row_num:=0) B ORDER BY ID DESC
這樣我們就可以得到一張有自增長列的結果集了,接下來還是按照上面類似的方法,取前10%即可。
SELECT * FROM ( SELECT A.*, @row_num:=@row_num+1 AS ROW_NUM FROM City A , (SELECT @row_num:=0) B ORDER BY ID DESC ) C WHERE C.ROW_NUM<=(@row_num*0.1)
其實MySQL 5.X也挺簡單的,只是當時不怎麼想用變數,想看看有沒有其他辦法,最後發現還是得用變數。
以上就是不同平臺的資料庫求前百分之N的方法了,程式碼可以驗證一下收藏起來留著下次直接套用。
總結
其中有涉及一些知識點,需要小夥伴們自己去進一步瞭解:
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2902896/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Navicat Premium for Mac(多連線資料庫管理工具)
- crane:字典項與關聯資料處理的新思路
- 開啟算力新時代——構建綠色資料中心,加速實現“雙碳”目標
- 從SOL到NoSQL,資料庫還要向何處演進?
- 專案效能優化之給dist資料夾中chunk-vendors.js做splitChunks分包,從而減少首屏載入時間
- 請求一下子太多了,資料庫危
- Redis系列2:資料持久化提高可用性
- Omni Recover Mac版(iPhone資料恢復軟體)
- 多重連線的資料庫管理工具Navicat Premium中文
- 定製化大規模網路資料採集企業級資料採集一站式解決方案
- 大資料視覺化有哪些優勢呢?
- 美創資料安全管理平臺獲信通院“資料安全產品能力驗證計劃”評測證書
- python實現股票歷史資料析
- RestCloud ETL WebService資料同步到本地
- PostgreSQL 15新版本特性解讀(含直播問答、PPT資料彙總)
- AntDB資料庫線上培訓開課啦!更靈活、更專業、更豐富
- 記憶體資料庫在電信行業業務場景有什麼應用?
- 使用MySqlBulkLoader批量插入資料