如何在不同的資料平臺取前百分之N的記錄?
導讀 | 最近幫業務部門梳理業務報表,其中有個需求是就算某指標等待時間最長的前百分之十,其實就是對等待時長進行倒序排序後,取結果集的前百分之十。這個需求在SQL Server和Oracle上都很容易實現,甚至是在MySQL 8.0也很容易實現,只是恰好我們業務資料庫是MySQL 5.7。 |
先給大家介紹下不同資料庫平臺的實現方法。
SQL Server上有個TOP Percent的方法可以直接取結果的前(或後)百分之N。
例如有如下一張City表:
我們取前10%的資料記錄可以這樣寫:
SELECT TOP 10 PERCENT * FROM City ORDER BY ID DESC
結果如下:
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的實現方法主要是藉助視窗函式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是沒有開窗函式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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 不同資料庫限制取前N條記錄資料庫
- 獲取當前修改的行記錄資料
- 如何在前臺獲取模型的關聯資料模型
- [轉載 mos] Oracle RAC 不同版本不同平臺官檔收集記錄Oracle
- MySQL分組查詢後獲取前N條資料MySql
- 如獲取獲取關聯資料的文件跟模型的關聯資料集呢模型
- 資料平臺、大資料平臺、資料中臺……還分的清不?大資料
- 如實實現不同資料庫之間的 (模型) Eloquent: 關聯資料庫模型
- 思泉軟體開發平臺如何在已存在的流程記錄上發起流程?
- Apache Hop新執行資訊記錄平臺Apache
- 跨平臺銷售策略:透過API同步不同市場的商品資料API
- 小程式雲開發獲取不到資料庫的記錄資料庫
- 又一知名平臺資料庫暴雷!1300萬條敏感記錄曝光資料庫
- spring的前後臺資料傳輸。Spring
- SAP Cloud for Customer(C4C)前臺顯示的資料是如何從後臺讀取的Cloud
- 直播軟體原始碼,js獲取n天前的日期原始碼JS
- 剖析大資料平臺的資料處理大資料
- 壓測平臺 - 記錄一次百億級資料查詢最佳化
- 如何利用API介面獲取電商平臺資料?API
- 在 Excel 裡使用 ODBC 讀取 SAP BTP 平臺上 CDS view 的資料ExcelView
- TDS:標籤平臺+API平臺+資料共享平臺,助力資料運營平臺建設API
- 基礎資料平臺的前世今生
- HyBridCLR在WebGL平臺下面打包出現的問題記錄Web
- Flutter 記錄 - Flutter 與跨平臺框架們的眾樂樂Flutter框架
- Django實現教育平臺全程記錄-----後臺管理Django
- postgresql 多條記錄合併一條,或取最新的一條資料SQL
- DataPipeline在大資料平臺的資料流實踐API大資料
- MySQL 分組排序後 → 如何取前N條或倒數N條MySql排序
- 資料庫平臺資料庫
- git 不同目錄用不同的配置Git
- Laravel前後臺共享資料Laravel
- 前臺提交資料規範
- 唐朝的大資料平臺 - 大案牘術大資料
- 在 X86_64(amd64) 平臺上的docker支援打包跨平臺的映象(如arm64)Docker
- ABL獲取XBL資訊記錄
- 直播平臺原始碼,快速獲取當前狀態列高度原始碼
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- 獲取登入驗證碼失敗及前後端不同域導致session丟失問題分析記錄後端Session