排名(行数)和分组的Mysql查询
我提到了类似的问题 但它在SQL server中,Mysql不支持“分区方式”,我现在知道我能做什么?问题是: 我有一个表,它有一些列:User、Category、Value 我想做一个查询,根据值对所有用户进行排名,但对类别进行重置 例如:排名(行数)和分组的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 查询将返回
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)@瓦希达萨迪:你应该在发布问题时决定要求。不是在某人根据帖子中给出的信息发布了答案,但没有阅读评论之后。