【问题标题】:Mysql Query for Rank (RowNumber) and GroupingsMysql查询排名(RowNumber)和分组
【发布时间】:2014-06-14 05:09:32
【问题描述】:

我也有提到in this thead的类似问题

但它在 SQL Server 中,并且 Mysql 不支持“分区依据”,因为我现在知道我能做什么?这是问题:

我有一个包含一些列的表:用户、类别、值

我想进行一个查询,该查询将按值对所有用户进行排名,但会针对类别进行重置。

例子:

user1   CategoryA    10

user2   CategoryA    11

user3   CategoryA    9

user4   CategoryB    3

user1   CategoryB    11

查询将返回:

Rank   User     Category  
1     user2   CategoryA

2     user1   CategoryA

3     user3   CategoryA

1     user1   CategoryB

2     user4   CategoryB

有什么想法吗?

【问题讨论】:

  • 不确定我是否明白你在做什么,看看GROUP BY

标签: mysql rank


【解决方案1】:

您可以为此使用变量:

select rank, user, category
from (select t.*,
             @rank := if(@cat = category, @rank + 1, 1) as rank,
             @cat := category
      from table t cross join
           (select @cat := '', @rank := 0) const
     ) t
order by category, rank;

【讨论】:

    【解决方案2】:

    编辑 2:基于 OP 的评论:

    它的排名有点错误,这是第一个rank。当相似的categories 和相同的value 有顶部rank 其中一个是@987654326 中的第一个@ 和 other 是第二个,但他们必须有第一个 rank (1)

    建议进行以下更改:

    select rank, user, category, value
    from (
      select user, @cc:=category category, @cv:=value value
        , case when @pc=@cc and @pv=@cv then @rn:=@rn
               when @pc=@cc and @pv!=@cv then @rn:=(@rn+1)
               else @rn:=1
          end as rank
        , @pc:=@cc as temp_currCat
        , @pv:=@cv as temp_currVal
      from user_category_values,
           (select @pc:='', @cc:='', 
                   @pv:='', @cv:='', 
                   @rn:=0) row_nums
      order by category asc, value desc
    ) results;
    

    演示@MySQL 5.5.32 Fiddle

    【讨论】:

    • Ravinder 和 Gordon Linoff 感谢您的快速回复。我测试了 Ravinder 的它运行完美,但问题是在具有相同值的同一类别中,它具有增加的排名而不是相同的 ranknig。 Gordon Linoff 我刚刚在小提琴中测试了你的代码,它有错误
    • 你非常好,谢谢你的帮助。它的排名有点错误,这是第一名。当具有相同价值的类似类别排名第一时,其中一个是第一名在排名中,其他排名第二,但他们必须排名第一(1)
    • @vahidasadi:您应该在发布问题时确定要求。不是在有人根据帖子中提供的信息发布答案但没有从 cmets 读取答案之后。
    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多