MySQL 分组排名 实现 ROW_NUMBER() OVER (PARTITION BY ORDER BY )

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangyongze_z/article/details/85341488

Mysql 中因为没有ROWNUM伪列、 那么想要排名、 我们就先要搞出一列伪列、 用作排名

伪列为分组排名的核心内容

SELECT
 (@r :=@r + 1) AS rank
FROM  (SELECT @r := 0) r 
 ;

执行结果


举个例子:

创建临时表插入测试数据

CREATE TEMPORARY TABLE tm_test (num int , createdat datetime  );
INSERT INTO tm_test (num, createdat)  VALUES (1, '2018/12/28 21:41:20');
INSERT INTO tm_test (num, createdat)  VALUES (1, '2018/12/28 21:42:20');
INSERT INTO tm_test (num, createdat)  VALUES (1, '2018/12/28 21:42:20');
INSERT INTO tm_test (num, createdat)  VALUES (1, '2018/12/28 21:43:20');
INSERT INTO tm_test (num, createdat)  VALUES (1, '2018/12/28 21:44:20');
INSERT INTO tm_test (num, createdat)  VALUES (2, '2018/12/29 21:41:20');
INSERT INTO tm_test (num, createdat)  VALUES (2, '2018/12/29 21:42:20');
INSERT INTO tm_test (num, createdat)  VALUES (2, '2018/12/29 21:42:20');
INSERT INTO tm_test (num, createdat)  VALUES (2, '2018/12/29 21:43:20');
INSERT INTO tm_test (num, createdat)  VALUES (2, '2018/12/29 21:44:20');
INSERT INTO tm_test (num, createdat)  VALUES (3, '2018/12/30 21:41:20');
INSERT INTO tm_test (num, createdat)  VALUES (3, '2018/12/30 21:42:20');
INSERT INTO tm_test (num, createdat)  VALUES (3, '2018/12/30 21:42:20');
INSERT INTO tm_test (num, createdat)  VALUES (3, '2018/12/30 21:43:20');
INSERT INTO tm_test (num, createdat)  VALUES (3, '2018/12/30 21:44:20');
  SELECT * FROM tm_test;

在这里插入图片描述


根据某列顺序排名:

 SELECT a.*,(@r :=@r + 1) AS rank
FROM tm_test a,(SELECT @r := 0) r 
ORDER BY createdat;

在这里插入图片描述


根据某列顺序排名(相同内容排名一致):

SELECT a.* ,
CASE 
WHEN @p=a.createdat THEN @r
WHEN @p:=a.createdat THEN @r:=@r+1
END rank
FROM tm_test a ,(SELECT @r:=0,@p:=NULL)r
ORDER BY a.createdat;

在这里插入图片描述


分组排名:

SELECT num,createdat,rank
  FROM
  (
 SELECT  a.*,IF(@p=a.num,@r:=@r+1,@r:=1) AS rank,
  @p:= a.num
  FROM tm_test a,(SELECT @p:=NULL,@r:=0)r
  ORDER BY a.num,a.createdat  
  )z;

在这里插入图片描述


分组排名(相同内容排名一致):

 SELECT num,createdat,rank
     FROM
  (
   SELECT *,
  IF(@p=num,
      CASE 
         WHEN @s=createdat THEN @r
      WHEN @s:=createdat THEN @r:=@r+1
     END,
     @r:=1 ) AS rank,
    @p:=num,
    @s:=createdat
    FROM tm_test,(SELECT @p:=NULL,@s:=NULL,@r:=0)r
     ORDER BY num,createdat desc
     )z;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhangyongze_z/article/details/85341488