在mysql中的分区上排名()

时间:2017-07-20 03:57:51

标签: mysql rank partition-by

我完全不知道要创建一个新专栏" LoginRank"来自于mysql的rank()over(x by x,order by y desc)。

从sql server我会编写以下查询,以创建一个列" Loginrank"按"登录"分组并由" id"。

命令
select ds.id, 
       ds.login, 
       rank() over(partition by ds.login order by ds.id asc) as LoginRank
from tablename.ds

我有下表。

create table ds (id int(11), login int(11))
insert into ds (id, login) 
values  (1,1),
    (2,1),
    (3,1),
    (4,2),
    (5,2),
    (6,6),
    (7,6),
    (8,1)   

我尝试将许多现有的mysql修复程序应用于我的数据集,但仍然存在问题。

非常感谢任何帮助。 谢谢!

3 个答案:

答案 0 :(得分:5)

尝试此查询: - MySql不支持Rank()函数。

select result.id,result.login,result.rank from (
  SELECT    id,
              login,
              IF(login=@last,@curRank:=@curRank,@curRank:=@_sequence) AS rank,
              @_sequence:=@_sequence+1,
              @last:=login
    FROM      ds , (SELECT @curRank := 1, @_sequence:=1, @last:=0) r
    ORDER BY  id asc) as result;

希望它可以帮到你!

答案 1 :(得分:2)

在Mysql 8.0之后,您可以使用Rank函数

 RANK() OVER (
    ORDER BY column_name
) my_rank

RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)

here is the usage

答案 2 :(得分:1)

尝试一下:

SELECT a.id, a.login, count(b.id)+1 as loginRank
FROM ds a left join ds b ON a.id>b.id AND a.login=b.login
GROUP BY a.id, a.login
ORDER BY a.login, loginRank

您将获得:

id | login | loginRank
 1 |   1   |    1
 2 |   1   |    2
 3 |   1   |    3
 8 |   1   |    4
 4 |   2   |    1
 5 |   2   |    2
 6 |   6   |    1
 7 |   6   |    2