Mysql一種模擬row_number() over方式及理解

前言:Oracle中row_number() over分析函數,有時使用來解決問題非常方便,但最近項目用mysql處理數據需用到類似功能,找了下在mysql中沒有類似的函數,此處記錄使用mysql變量來模擬類似效果。
SQL語句如下:
SELECT * FROM
(SELECT
F.PARTY_ID AS PARTY_ID,
F.ALL_COUNT AS ALL_COUNT,
F.SU AS SU,
CASE
WHEN @PARTY_ID != PARTY_ID THEN
@ROWNUM := 1
ELSE
@ROWNUM :=@ROWNUM + 1
END AS ROWNUM,
@PARTY_ID := PARTY_ID AS PARTY_ID12
FROM
(SELECT @F.PARTY_ID := “”) c,
(SELECT @ROWNUM := 0) r,
(
SELECT
E.PARTY_ID AS PARTY_ID,
E.SU AS SU,
E.ALL_COUNT AS ALL_COUNT
FROM
(
SELECT
c.PARTY_ID AS PARTY_ID,
COUNT(*) AS SU,
d.AMT AS ALL_COUNT
FROM
dpf_ckaccno_dtl d
JOIN dpf_ckaccno c ON d.ACC_NO = c.DM01ACCT
WHERE
d.CRDFLG = ‘D’
GROUP BY
c.PARTY_ID,
d.AMT
) E
ORDER BY
E.PARTY_ID,
E.SU DESC,
E.ALL_COUNT DESC
) F ) G WHERE G.ROWNUM<=3
說明:1、(SELECT @ROWNUM := 0)r 用於定義變量並初始化,後面是命別名,此處不能省略,不然會報錯。
2、 @PARTY_ID := PARTY_ID AS PARTY_ID12 此處是把當前行值賦值給PARTY_ID 變量,前面(SELECT @F.PARTY_ID := “”) c,已經將其初始化爲空串
3、CASE
WHEN @PARTY_ID != PARTY_ID THEN
@ROWNUM := 1
ELSE
@ROWNUM :=@ROWNUM + 1
END AS ROWNUM, – 此處通過case when 條件句來判斷變量值與當前PARTY_ID是否相等來,不等說明是新的PARTY_ID,ROWNUM 就爲1,否則就+1
4、通過這個sql,我們可以發現mysql在sql語句中使用變量時,初始化的東西放到from語句的後面,使變量的變化語句要放到查詢結果裏面,這裏的原因可能是跟數據庫管理系統解析一個sql的順序有關係吧(猜的!!!)
結果如下:
這裏寫圖片描述

參考:mysql中實現row_number() over(http://www.zhimengzhe.com/shujuku/MySQL/117054.html)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章