w**a 发帖数: 487 | 1 +-----+--------+-------+
| ID | NAME | SCORE |
+-----+--------+-------+
| 100 | sam | 3.60 |
| 101 | David | 3.65 |
| 102 | Rachel | 4.00 |
| 103 | Amanda | 3.80 |
| 104 | Mike | 4.00 |
| 105 | Amy | 3.65 |
| 106 | John | 3.40 |
| 107 | May | 3.75 |
| 108 | Tony | 3.20 |
+-----+--------+-------+
9 rows in set (0.00 sec)
上面是一个简单的成绩表,要求给出按分数的排名,排名不能跳过相同的分数,比如:
4.00 1
4.00 1
3.80 2
3.75 3
3.65 4
3.65 4
请问,有什么好办法?
这个题算容易,还是难啊?有多少人在电话上可以当时在电话上做出来啊? |
b******e 发帖数: 671 | 2 可以这样做。
先把DISTINCT的成绩找出来,再上RANK(), 再和原来的成绩列JOIN. |
w**a 发帖数: 487 | 3 如果只RANK() distinct的成绩,最后JOIN时,那些重复的成绩怎么得到排名呢?
【在 b******e 的大作中提到】 : 可以这样做。 : 先把DISTINCT的成绩找出来,再上RANK(), 再和原来的成绩列JOIN.
|
x****k 发帖数: 34 | 4 select
scores.score, r
from
scores
join
(
select
score,
rank() over (order by score desc) as r
from (
select
distinct score
from scores
) s
) s1
on scores.score = s1.score
order by scores.score desc; |
b******e 发帖数: 671 | 5 最后的JOIN就是为了得到重复的啊。 1:n的JION.
【在 w**a 的大作中提到】 : 如果只RANK() distinct的成绩,最后JOIN时,那些重复的成绩怎么得到排名呢?
|
l****e 发帖数: 17 | |
x****k 发帖数: 34 | 7 dense_rank is the best solution |