Rank() over Partition by in mysql

2019-01-09 17:03发布

I'm completely stumped as to create a new column "LoginRank" from rank() over(partition by x, order by y desc) in mysql.

From sql server i would write the following query, to create a column "Loginrank" that is grouped by "login" and ordered by "id".

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

I have the following table.

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)   

I tried applying many existing mysql fixes to my dataset but continue to have issues.

Any help is greatly appreciated. Thanks!

2条回答
等我变得足够好
2楼-- · 2019-01-09 17:39

Try this query: - MySql does not support Rank() function.

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;

Hope it helps you!

查看更多
欢心
3楼-- · 2019-01-09 17:41

After Mysql 8.0 you can use Rank function

 RANK() OVER (
    ORDER BY column_name
) my_rank

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

here is the usage

查看更多
登录 后发表回答