MySQL实现SQL server中的Row_Number() over(partition by ... Order By ...) 分组排序

背景:产品升级需要兼容MySQL环境运行,需要将原有的SQL server语句转成MySQL写法。

SQL server:

    分组排序语法: Row_Number() over(partition by 分组字段A,分组字段B,... Order By 排序字段...)

然而MySQL中没有该语法,可以使用参数的方式进行实现。

查询模板:

1、partition by后跟一个参数
SQL server:
SELECT Row_Number() over(partition by A.字段2 Order By 排序字段)
FROM 表A

MySQL:
SELECT IF(@P = A.字段2,@R:=@R + 1,@R:=1) AS 分组排序字段
,@P := A.字段2 AS 给参数赋值1
FROM (SELECT @R:=0) AS Q,(
    SELECT 字段1,字段2,字段3
    FROM AS 表A,(SELECT @P:=NULL) AS B
    ) AS A
ORDER BY 排序字段


2、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 分组排序字段
,@P := A.字段2 AS 给参数赋值1, @G := A.字段3 AS 给参数赋值2
FROM (SELECT @R:=0) AS Q,(
    SELECT 字段1,字段2,字段3
    FROM AS 表A,(SELECT @P:=NULL,@G:=NULL) AS B
    ) AS A
ORDER BY 排序字段

MySQL方式解释:

1、使用子查询将非分组排序字段之外的字段查出来,并且定义参数以及赋初始值NULL,

例如:(SELECT @P:=NULL,@G:=NULL) AS B,如需多个参数则在括号内递增

2、外层查询定义排序参数(SELECT @R:=0) AS Q,其次使用IF(expr1,expr2,expr3)函数统计出排序字段,

例如:IF(@P = A.字段2,@R:=@R + 1,@R:=1) AS 分组排序字段,

如过分组是通过多个字段进行分组的则在IF()函数第一个参数内使用 AND 进行凭借,

例如:IF(@P = A.字段2 AND @G = A.字段3,@R:=@R + 1,@R:=1) AS 分组排序字段

3、关于IF函数参数解释为,当第一个参数满足时,输出参数2;否则输出参数3,从而得到分组排序字段。

SQL server查询: 

MySQL实现SQL server中的Row_Number() over(partition by ... Order By ...) 分组排序_第1张图片

MySQL查询:

 MySQL实现SQL server中的Row_Number() over(partition by ... Order By ...) 分组排序_第2张图片

你可能感兴趣的:(MySQL,mysql)