Rank() 在 mysql 中的分区上

Posted

技术标签:

【中文标题】Rank() 在 mysql 中的分区上【英文标题】:Rank() over Partition by in mysql 【发布时间】:2017-07-20 03:57:51 【问题描述】:

我完全不知道如何在 mysql 中从 rank() over(partition by x, order by y desc) 创建一个新列“LoginRank”。

我会从 sql server 编写以下查询,以创建一个按“login”分组并按“id”排序的“Loginrank”列。

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 修复应用到我的数据集,但仍然存在问题。

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

【问题讨论】:

【参考方案1】:

试试这个查询: - 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;

希望对你有帮助!

【讨论】:

谢谢。我利用了您上面的回复,效果很好。 不应该是“支持”吗?【参考方案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

【讨论】:

【参考方案3】:

试试这个:

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

【讨论】:

以上是关于Rank() 在 mysql 中的分区上的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 窗口函数 - rank() 按 bigint 分区

Rank 分区中的情况

MySql窗口函数

MySql中row_number()rank()dense_rank() 的区别

查询没有分区依据或类似 rank() 的函数

mysql窗口函数rank() over、dense_rank() over、row_number() over 使用心得