MYSQL中实现ORACLE的 over partition by

业务场景

Oracle迁移Mysql,某查询逻辑中用到了
聚合函数( ) OVER ( [ partition by 字段] [order by 字段]) 如:

row_number() over ( PARTITION BY 年级,班级,学科 ORDER BY 分数 DESC ) rn  

比如要实现年级、班级、学科根据分数的维度排名或叫排序等场景。

实现原理

PARTITION 聚合分组部分是相同的,组装成一个字符创也是相同的,根据排序后利用字符串错行对比,条件递增RN

1、用到临时变量@rownum,@grpstr(名称可自定义)
2、将PARTITION BY的条件拼接到一个字符串,赋值给@grpstr
3、利用@grpstr错行对比,与上条不相等则:@rownum:=@rownum+1否则@rownum:=1
4、查询条件最后要根据ORDER BY 部分排序(注意:排序需加上分组部分,起决定性的排序放在最后)
5、RN和RG是临时产生的列信息,外层逻辑有用到就用没有用到忽略之。

案例实现效果如下:

image.png

思想

合理利用动态参数;
有顺序的错行对比;
两组数据多个信息分别相同,这几个信息组合在一起也是相同的。

思想需要意会,有需要指导或交流的可留言!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容