mysql的分析函数_MySQL分析函数实现

| MySQL分析函数实现

还好MySQL8.0已经实现了与Oracle相同的分析函数。

1. 实现rownum

SET @rn:=0;

SELECT @rn:=@rn+1 AS rownum ,e.* FROM emp e;

700e4a76df2299c10202accd7e532b93.png

或者写成:

SELECT @rn:=@rn + 1 AS rownum ,e.* FROM emp e ,(SELECT @rn:=0) c

2. 各种分析函数写法 (MySQL实现分析语句时可能遇到的各种计算问题)

2.1 sum() 实现

--SQL 执行顺序 ,FROM ,JOIN ,WHERE ,GROUP BY,HAVING ,ORDER BY ,SELECT,

在Oracle中分页语句的原始语句如下:

SELECT E.*, SUM(SAL) OVER(PARTITION BY DEPTNO) AS COUNTOVER FROM EMP E;

b0004ac2f26204a091567248ebfcdd3a.png

SELECT E.*,

(SELECT SUMOVER

FROM (SELECT DEPTNO, SUM(SAL) AS SUMOVER

FROM EMP E1

GROUP BY DEPTNO) X

WHERE X.DEPTNO = E.DEPTNO) AS COUNTOVER

FROM EMP E

ORDER BY DEPTNO;

c387ec89d7ebd2d9087bf6c62e703b86.png

Mysql中也是这么实现的:

SELECT E.*,

(SELECT SUMOVER

FROM (SELECT DEPTNO, SUM(SAL) AS SUMOVER

FROM emp E1

GROUP BY DEPTNO) X

WHERE X.DEPTNO = E.DEPTNO) AS COUNTOVER

FROM emp E

ORDER BY DEPTNO;

1e21630cd4dff57077d28fe248e4b15e.png

2.2 row_number () 实现

select

e.* ,row_number() over(partition by deptno order by empno) as ROW_NUMBER from emp e;

11e080af72211eec461185553a04b798.png

我们的默认规则是在from后初始化变量。

SELECT E.*,

IF(@DEPTNO = DEPTNO, @RN := @RN + 1, @RN := 1) AS ROW_NUMBER,

@DEPTNO := DEPTNO AS VAR1

FROM EMP E, (SELECT @DEPTNO := '', @RN := 0) C

ORDER BY DEPTNO;

f503de5c7867614acf7222e7399cc7e3.png

SELECT E.*,

IF(@DEPTNO = DEPTNO, @RN := @RN + 1, @RN := 1) AS ROW_NUMBER,

@DEPTNO := DEPTNO AS VAR1

FROM EMP E, (SELE

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值