mysql5.7 分组排序_Mysql5.7版本实现row_number窗口函数的分组排序功能

在 sql server中outer apply / cross apply 可以更高效率的实现跟row_number函数同等的功能

但mysql 5.7 不仅outer apply / across apply 没有, row_number也没有. 哭 !

听说mysql 8.0 版本 也可以使用row_number函数了

但我们使用的是5.7版本

网上的资料很多, 但感觉不够简洁明了, 所以决定自己写一下

SELECT * FROM(SELECT

@rn:= CASE WHEN @securityid = securityid THEN @rn + 1 ELSE 1 END ASrn,@securityid:= securityid assecurityid,

volume, dateFROM(SELECT * from us_historicaldaily WHERE DATE <= '2019-05-16' ORDER BY securityid, date DESC) a

,(SELECT @rn=0, @securityid=0) b

)aWHERE rn <= 5

这里有几点解释下:

1. 这里对表分组的依据是securityid, 排序的依据是date

相当于有个指针在从上往下滑动,  需要一个用户变量@securityid来记录最近一次securityid的值,

然后跟当前行的securityid列做对比, 如果相等(@securityid = securityid) 说明当前在同一个分组中, @rn 递增1 ,

否则说明当前组已经变更了 @rn重新计数, 从1开始

2. a表中order by 是必须的,  因为只有排序的表从上往下遍历才有意义,

而且order by的字段顺序要相当于row_number函数的 partition by securityid order by date desc

由于sql的执行顺序, order by 排在select 之后, 所以order by语句必须写在a表中, 而不是整个sql的末尾(恰好mysql支持order by语句写在表中)

3. b表也是必须的, b表相当于在a表后面加两个字段初始化这两个变量的值, 也可以用set关键字初始化, 但我还是喜欢用表.

结果如下

13ef8b28e7e1c0ea27f5442d345b8434.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值