欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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还是差那么点东西,没那么简单化和方便化。

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

相关标签: mysql