我在stackOverflow找到了这个Q& A,同时搜索了对排名数据进行分组的方法。这些解决方案完美无缺,但如何解释群体内部的联系?
到目前为止,我知道如何排名,但我不知道如何解释群体中的关系。
+--------------------------------------------+
| id | code | score | rank |
+--------------------------------------------+
| 2477 | 312 | 64 | 1 |
| 1865 | 312 | 63 | 2 |
| 2511 | 312 | 62 | 3 |
| 2890 | 312 | 61 | 4 |
| 1335 | 312 | 61 | 5 |
| 1504 | 312 | 60 | 6 |
| 1385 | 312 | 60 | 7 |
| 1984 | 312 | 59 | 8 |
| 2477 | 212 | 64 | 1 |
| 1865 | 212 | 63 | 2 |
| 2511 | 212 | 62 | 3 |
| 2890 | 212 | 61 | 4 |
| 1335 | 212 | 61 | 5 |
| 1504 | 212 | 60 | 6 |
| 1385 | 212 | 60 | 7 |
| 1984 | 212 | 59 | 8 |
我需要的是:
+--------------------------------------------+
| id | code | score | rank |
+--------------------------------------------+
| 2477 | 312 | 64 | 1 |
| 1865 | 312 | 63 | 2 |
| 2511 | 312 | 62 | 3 |
| 2890 | 312 | 61 | 4 |
| 1335 | 312 | 61 | 4 |
| 1504 | 312 | 60 | 5 |
| 1385 | 312 | 60 | 5 |
| 1984 | 312 | 59 | 6 |
| 2477 | 212 | 64 | 1 |
| 1865 | 212 | 63 | 2 |
| 2511 | 212 | 62 | 3 |
| 2890 | 212 | 61 | 4 |
| 1335 | 212 | 61 | 4 |
| 1504 | 212 | 60 | 5 |
| 1385 | 212 | 60 | 5 |
| 1984 | 212 | 59 | 6 |
有没有办法获得上述结果?
答案 0 :(得分:0)
如果您需要在同一代码组中为相同分数指定相同的排名,则必须嵌套case
语句
select `id`, `code`, `score`,rank
from (
select `id`, `code`, `score`,
@r:= case when @g = `code`
then
case when @s <> `score` then @r + 1 else @r end
else 1
end rank,
@g:= `code`,
@s:= `score`
from table1
cross join(select @g:=null,@r:=0,@s:=null) t
order by `code` desc, `score` desc
) t1
首先case
语句将检查相同的code
组,如果找到相同的代码,则then
部分父case
中会有另一个孩子{{1} }语句将检查分数是否与前一个不同,然后增加排名变量,否则将相同的排名分配给当前行