Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
排名(行数)和分组的Mysql查询_Mysql_Rank - Fatal编程技术网

排名(行数)和分组的Mysql查询

排名(行数)和分组的Mysql查询,mysql,rank,Mysql,Rank,我提到了类似的问题 但它在SQL server中,Mysql不支持“分区方式”,我现在知道我能做什么?问题是: 我有一个表,它有一些列:User、Category、Value 我想做一个查询,根据值对所有用户进行排名,但对类别进行重置 例如: user1 CategoryA 10 user2 CategoryA 11 user3 CategoryA 9 user4 CategoryB 3 user1 CategoryB 11 查询将返回

我提到了类似的问题

但它在SQL server中,Mysql不支持“分区方式”,我现在知道我能做什么?问题是:

我有一个表,它有一些列:User、Category、Value

我想做一个查询,根据值对所有用户进行排名,但对类别进行重置

例如:

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

有什么想法吗?

您可以使用变量:

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:根据OP的评论:

它只处理了一点小错误的排名,这是第一个
排名
。当具有相同
的类似
类别
具有最高的
排名
时,其中一个是
排名
中的第一个,另一个是第二个,但它们必须具有第一个
排名
(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;

演示@

不确定我是否看到了您正在尝试做的事情,请查看
GROUP BY
Ravinder和Gordon Linoff thanx,以获得您的快速回复。我测试了Ravinder的it运行完美,但问题是,在具有相同值的同一类别中,它的排名增加,而不是排名相同。Gordon Linoff我刚刚用fiddle测试了你的代码,它出现了错误。非常感谢你和thanx的帮助。它的排名有点错误,这是在第一位。当具有相同值的类似类别具有最高排名时,其中一个是排名第一,另一个是第二,但它们必须具有第一位(1)@瓦希达萨迪:你应该在发布问题时决定要求。不是在某人根据帖子中给出的信息发布了答案,但没有阅读评论之后。