mysql实现row_number()和row_number() over(partition by)
row_number() 僅僅是價格排序字段
select @rownum := @rownum + 1 as rn, t.*from (select @rownum := 0) r, test_table tselect @rank:=@rank+1 as rank ,t.* from (select @rank:=0) r, DM_GOA.dm_goa_fin_inv_mly_d t;解釋:給test_table里的數據設置行號, rn是行號
?
row_number() over(partition by)
select if(@uid = t.user_id and @cid = t.city_id,@rank := @rank + 1,@rank := 1) as rank,t.*,@uid := t.user_id,@cid := t.city_idfrom (select @uid := null, @cid := null, @rank := 0) r,(select user_id, city_id, city_name, idfrom t_user_cityorder by user_id, city_id, id) t;解釋:對t_user_city表按照user_id,city_id兩個字段做分組設置行號,rank是分組的行號,order by里一定要有兩個分組字段及第三個排序字,上面if 也可以用case when
SELECT *FROM (SELECTF.PARTY_ID AS PARTY_ID,F.ALL_COUNT AS ALL_COUNT,F.SU AS SU,CASEWHEN @PARTY_ID != PARTY_ID THEN@ROWNUM := 1ELSE@ROWNUM := @ROWNUM + 1END AS ROWNUM,@PARTY_ID := PARTY_ID AS PARTY_ID12FROM (SELECT @F.PARTY_ID := “”) c,(SELECT @ROWNUM := 0) r,(SELECTE.PARTY_ID AS PARTY_ID,E.SU AS SU,E.ALL_COUNT AS ALL_COUNTFROM (SELECTc.PARTY_ID AS PARTY_ID,COUNT(*) AS SU, d.AMT AS ALL_COUNT FROM dpf_ckaccno_dtl d JOIN dpf_ckaccno cON d.ACC_NO = c.DM01ACCTWHERE d.CRDFLG = ‘D’GROUP BY c.PARTY_ID, d.AMT) EORDER BY E.PARTY_ID,E.SU DESC,E.ALL_COUNT DESC) F) GWHERE 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的順序有關系
?
? ? ? ? ? ? ?F.PARTY_ID AS PARTY_ID,
? ? ? ? ?F.ALL_COUNT AS ALL_COUNT,
? ? ? ? ?F.SU AS SU, ? ? ?
PARTY_ID? ? ? ? ALL_COUNT? ?SU? ROW_NUM? ?PARTY_ID_12
102902? ? ? ? ? ? ? ? ?5000? ? ? ? ? ? 18? ? ? ? ? ?1? ? ? ? ? ? ? ? ? ? ? 102902
102902? ? ? ? ? ? ? ? ?2000? ? ? ? ? ? 18? ? ? ? ? ?2? ? ? ? ? ? ? ? ? ? ? 102902
102902? ? ? ? ? ? ? ? ?2? ? ? ? ? ? ? ? ? ?18? ? ? ? ? 3? ? ? ? ? ? ? ? ? ? ? 102902
104631? ? ? ? ? ? ? ? ?4900? ? ? ? ? ? ?12? ? ? ? ??1 ? ? ? ? ? ? ? ? ? ? ?104631
104631? ? ? ? ? ? ? ? ?500? ? ? ? ? ? ? ?12? ? ? ? ? ?2? ? ? ? ? ? ? ? ? ? ?104631
104631? ? ? ? ? ? ? ? ?2000? ? ? ? ?? ? ?6? ? ? ? ? ? 3? ? ? ? ? ? ? ? ? ? ?104631
104658? ? ? ? ? ? ? ? ?5000? ? ? ? ? ? 192? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ?104658
104658? ? ? ? ? ? ? ? ?2000? ? ? ? ? ? 126? ? ? ? ? ? 2? ? ? ? ? ? ? ? ? ? ?104658
104658? ? ? ? ? ? ? ? ?1000? ? ? ? ? ? ? 48? ? ? ? ? ? 3? ? ? ? ? ? ? ? ? ? ?104658
總結
以上是生活随笔為你收集整理的mysql实现row_number()和row_number() over(partition by)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何根据字典中值的大小,对字典中的项排序
- 下一篇: mysql 获取工作日上一天的数据 环比