MySQL中row_number的實現(xiàn)過程
一 、背景
一般在數(shù)據(jù)倉庫環(huán)境中,我們可以很方便的使用row_number函數(shù)根據(jù)某個維度來對數(shù)據(jù)進行分組,實現(xiàn)每個組內(nèi)數(shù)據(jù)編號排序的效果。如下圖所示,該圖是在mysql環(huán)境中生成的效果圖,這里以lcid進行的分組,num等價于row_number函數(shù)實現(xiàn)的效果:
二、實現(xiàn)過程
1.設(shè)置mysql變量
設(shè)置兩個變量
set @row_number:=0; --根據(jù)lcid_no的判斷結(jié)果生成row_number序號 set @lcid_no:= 0; --用于獲取每行l(wèi)cid列數(shù)據(jù),然后與前面一行的lcid數(shù)據(jù)進行對比,若相同則自增1,否則為1
2.使用case when
SELECT @row_number:=CASE WHEN @lcid_no = s.lcid THEN @row_number + 1 ELSE 1 END AS num, @lcid_no:=s.lcid AS lcid, s.lcid FROM r_qcloud_approval_fh_d s,(select @orw_number:=0,@lcid_no:=0) t ORDER BY s.lcid;
3.過程分析
若存在多條相同數(shù)據(jù)情形
1)初始條件下,游標(biāo)指向第一條數(shù)據(jù),此時lcid_no = 0,lcid_no 不等于lcid,故row_number = 1
2)游標(biāo)指向第二條數(shù)據(jù),lcid_no = 上一條數(shù)據(jù)的lcid,因上一條數(shù)據(jù)的lcid = 當(dāng)前行l(wèi)cid,因此row_number =2
無重復(fù)數(shù)據(jù)情形
1)初始條件下,游標(biāo)指向第一條數(shù)據(jù),此時lcid_no = 0,lcid_no 不等于lcid,故row_number = 1
三、使用場景
在mysql這種關(guān)系型數(shù)據(jù)庫中,沒有row_number函數(shù)的情況下使用
到此這篇關(guān)于MySQL中row_number的實現(xiàn)過程的文章就介紹到這了,更多相關(guān)MySQL中row_number內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mac系統(tǒng)下源碼編譯安裝MySQL 5.7.17的教程
這篇文章主要介紹了Mac系統(tǒng)下源碼編譯安裝MySQL 5.7.17的教程詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03mysql日志文件General_log和Binlog開啟及詳解
MySQL中的數(shù)據(jù)變化會體現(xiàn)在上面日志中,下面這篇文章主要給大家介紹了關(guān)于mysql日志文件General_log和Binlog開啟及詳解的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07Mysql數(shù)據(jù)庫時間與系統(tǒng)時間不一致問題排查及解決
最近忽然發(fā)現(xiàn)個問題,Mysql數(shù)據(jù)庫時間與系統(tǒng)時間不一致,通過查找相關(guān)資料終于解決了,下面這篇文章主要給大家介紹了關(guān)于Mysql數(shù)據(jù)庫時間與系統(tǒng)時間不一致問題排查及解決的相關(guān)資料,需要的朋友可以參考下2023-06-06