业务场景
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是临时产生的列信息,外层逻辑有用到就用没有用到忽略之。
案例实现效果如下:
思想
合理利用动态参数;
有顺序的错行对比;
两组数据多个信息分别相同,这几个信息组合在一起也是相同的。
思想需要意会,有需要指导或交流的可留言!