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)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值