Mysql-变量的使用

 窗口函数可以点击此链接可以查看

  •  变量使用的易错点
    • 对于SET,可以使用=或:=作为分配符
    • 使用SELECT定义用户变量只能使用:=作为分配符(因为在非SET语句中 = 被视为一个‘比较操作符’.
  • 通过变量和if语句实现窗口函数(1):dense_rank()

SELECT
    salary,
    rk AS `RANK` 
FROM
    (
    SELECT
        salary,
    IF
        ----如果@pres和salary相等,则@currank 否则@currank等于@currank + 1
        ( @pres = salary, @currank, @currank := @currank + 1 ) AS rk,
        @pres := salary 
    FROM
        employee,(
        SELECT
            ----声明变量@pres为-1,@currank为0 
            @pres := - 1,
            @currank := 0 
        ) c1 
    ORDER BY salary DESC ) s

  •  通过变量和case when 语句实现窗口函数(2):dense_rank()

    SELECT
        salary,
        ( CASE WHEN @pres = salary THEN @currank WHEN @pres := salary THEN @currank := @currank + 1 END ) AS `RANK` 
    FROM
        employee,
        ( SELECT @pres := - 1, @currank := 0 ) AS c1 
    ORDER BY
    salary DESC;
   

  •  通过Count及DISTINCT实现窗口函数(3):dense_rank()

SELECT
    s.salary,
    ( SELECT COUNT( DISTINCT salary ) FROM employee e WHERE e.salary >= s.salary ) AS c1 
FROM
    employee s 
ORDER BY
    salary DESC; 

  •   通过group by,order by及变量实现窗口函数(4):dense_rank()

select 
    s.salary,
    r.rank
from 
    employee s,
    (
        select 
            tmp1.salary,
            (@rownum:=@rownum+1) as `Rank`
        from 
            (select salary from employee group by salary order by salary desc) as tmp1,
            (select @rownum:=0) tmp2
    ) as r
where 
    s.salary=r.salary 
    order by s.salary desc;

  • 通过if函数解决下面的变形题

 SELECT
    DISTINCT s.Num 
FROM
    (
    SELECT
        t.*,
    IF
        ( @before_num = t.Num, @times := @times + 1, 1 ) AS times,  
        @before_num := t.Num 
    FROM
        ( SELECT @before_num := NULL, @times := 1 ) r,
    test t 
    ) s
    
    WHERE s.times >=3

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值