mysql 如何实现类似row_number() over partition by多个字段分组排序
程序员文章站
2022-03-21 11:44:55
mysql数据库需要按字段排序后,按一定的重复字段组合进行行号统计时,如何编写语句呢?写过sqlserver的知道有row_number() over partition by如此语法轻松搞定!...
mysql数据库需要按字段排序后,按一定的重复组合进行行号统计时如何编写语句呢?写过sqlserver或oracle的有row_number() over partition by如此语法轻松搞定!
今天在把sqlserver的一个库改写为mysql数据后,涉及到的一些查询语句需要按mysql语法重写,毕竟mysql和sqlserver的语法还是有小部分的差别。
先看语法
partition by后跟两个参数 SQL server: SELECT Row_Number() over(partition by A.字段2,A.字段3 Order By 排序字段) FROM 表A MySQL: SELECT IF(@P = A.字段2 AND @G = A.字段3,@R:=@R + 1,@R:=1) AS rownum, @P := A.字段2 , @G := A.字段3 FROM ( SELECT 字段1,字段2,字段3, 字段4 FROM 表A ORDER BY 字段2,字段3,字段4 ) AS A ,(SELECT @R := 0,@P:=NULL,@G:=NULL) AS B
解释下mysql的语法,IF每行判断当前行的字段2和字段3 是否和前一行@P 和@G 变量的值相等,如果相等,@R:=@R+1,否则@R:=1。这里有个地方要注意的是每一行都需要执行后重新赋值@P := A.字段2 , @G := A.字段3,这个赋值必须要在判断之后,否则会造成一直递增。
再看下后面的FROM,表a和表b,表a是我们需要返回的数据集,表b作用是初始化变量@R和字段@P和@G。
我在网上百度翻的时候,发现很多都是乱写语句,胡乱举例子,很多是文章一通抄拿来发表,拿来测试根本不是那么回事,没有搞清楚怎么才能rownum在分组内递增。
下面示例sql语句例举
select if(@tmp=a.UserID and @tmp1=a.PlayType,@rownum:=@rownum+1,@rownum:=1) as rownum, @tmp:=a.UserID,@tmp1:=a.PlayType, ID from tb_Info a, (SELECT @rownum := 0, @tmp := null) b order by UserID,PlayType,createdate desc
按userid,playtype字段分组后,在组内进行排序,日期倒序按实际的需求来,并统计序号递增。
从以上语法跟sqlserve和oracler比对会发现,mysql还是差那么点东西,没那么简单化和方便化。
以上就是本文的总结,希望能帮助到你!
推荐阅读