使用MySQL按组排序结果并允许并列。

3
我有以下数据:
enrtryid    categoryid     score
   1             1         90.5
   2             1         90.5
   3             1         89
   4             2         70
   5             2         69
   6             3         78

我想要以下结果:

(文本内容)

enrtryid    categoryid     score    rank
   1             1         90.5      1
   2             1         90.5      1
   3             1         89        2
   4             2         70        1
   5             2         69        2
   6             3         78        1

我尝试使用查询。
SELECT t1.*, (SELECT COUNT(*) FROM overalltally t2 WHERE t2.score> t1.score) +1
AS rank
FROM overalltally t1
ORDER BY `rank` ASC

尽管它按顺序排列所有结果,但我不知道应该放置GROUP BY语句的位置。

请检查您的拼写:as rnk ... ORDER BY rank - Tim Lewis
1
https://dev59.com/foDba4cB1Zd3GeqPEXb5 - Neville Kuyt
我投票支持重新开放,因为这个问题与引用的那个问题并不完全相同。这里的OP想要按类别分组排名结果 - Giorgos Betsos
1
@NevilleK 这个问题不同,因为我想按类别排名。 - Alexander Kimaru
1
我已经投票重新开放这个问题。根据您当前的查询,将子查询更改为_(SELECT COUNT(*) FROM overalltally t2 WHERE t2.score> t1.score AND t2.categoryid = t1.categoryid)_。但也可以使用@StefanGehrig以下建议的变体来完成。 - Kickstart
显示剩余2条评论
1个回答

1
像这样的东西应该可以运行。
SELECT t1.*, @rank := IF(@previous = t1.score, @rank, @rank + 1) AS rank,
  @previous := t1.score
FROM overalltally t1, (SELECT @previous := null, @rank := 0) tmp_tbl
ORDER BY rank ASC

看起来有点棘手,但实际上这是一种处理MySQL缺失排序功能的标准方法。


这会按顺序排列所有行。如何按组排名? - Alexander Kimaru
您可以添加一个变量来存储和检查类别ID。同时,使用以下代码:SELECT t1.*, @rank := IF(@previous_cat = t1.categoryid, IF(@previous = t1.score, @rank, @rank + 1), 1) AS rank, @previous := t1.score, @previous_cat = t1.categoryid FROM ( SELECT enrtryid, categoryid, score FROM overalltally ORDER BY categoryid, score DESC ) t1 CROSS JOIN (SELECT @previous := null, @rank := 0, @previous_cat := 0) tmp_tbl ORDER BY categoryid, rank ASC - Kickstart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接