mysql 如何实现类似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还是差那么点东西,没那么简单化和方便化。

以上就是本文的总结,希望能帮助到你!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐