mysql 实现类似开窗函数的功能

mysql8 已经支持开窗函数 https://dev.mysql.com/doc/refman/8.0/en/window-functions.html

————————————————

sql server 的开窗函数

http://www.cnblogs.com/zihunqingxin/p/3638857.html

 

mysql8 之前的版本不支持开窗函数

 

目的,取每个channel 按created_on 倒序排的前20条

 

示例如下(有部分冗余数据)

select id,url,channel,created_on,rank 
from(
    select id,url,channel,created_on,rank 
    from (select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1 ,
          if(@pdept=article_tmp.channel,@rank:=@rank+1,@rank:=1) as rank,
          @pdept:=article_tmp.channel
          from (
                select id,url,channel,created_on 
                from article order by channel asc ,created_on desc
               ) article_tmp ,
               (select @rownum :=0 , @pdept := null ,@rank:=0) a 
    ) result
)t where rank<=20;

 

最核心的部分是

select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1 ,
          if(@pdept=article_tmp.channel,@rank:=@rank+1,@rank:=1) as rank,
          @pdept:=article_tmp.channel
          from (
                select id,url,channel,created_on 
                from article order by channel asc ,created_on desc
               ) article_tmp

 

原理是按channel 和 created_on 排序

两个临时变量

pdept

rank

pdept 指向channel

 

游标(这么说不准确,就是个遍历的过程)下移的过程中

pdept 未变,则rank++

若pdept 变化,则表示是新的channel  rank归0 

 

最后按取rank 的top N条数据 即可

select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1 ,
          if(@pdept=article_tmp.channel,@rank:=@rank+1,@rank:=1) as rank,
          @pdept:=article_tmp.channel
          from (
                select id,url,channel,created_on 
                from article order by channel asc ,created_on desc
               ) article_tmp

转载于:https://www.cnblogs.com/zihunqingxin/p/6734450.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值