編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(rank)相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有「間隔」。
+----+-------+例如,根據上述給定的| id | score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
scores
表,你的查詢應該返回(按分數從高到低排列):
+-------+------+| score | rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
createtable
ifnot
exists scores (id int, score decimal(3,2
));truncate
table
scores;
insert
into scores (id, score) values ('
1', '
3.5'
);insert
into scores (id, score) values ('
2', '
3.65');
insert
into scores (id, score) values ('
3', '
4.0'
);insert
into scores (id, score) values ('
4', '
3.85');
insert
into scores (id, score) values ('
5', '
4.0'
);insert
into scores (id, score) values ('
6', '
3.65
');
oracle可以使用排名函式進行排名,因為名次之間不應該有「間隔」,所以要使用dense_rank()函式,這個函式排的名次是連續的,rank()函式會跳過(並列排名),mysql依然是使用自定義變數來進行排名。
oracle
selectround(a.score,2) as
score, b.rank
from
scores a
join (select a.*, rownum as
rank
from (select
distinct a.score from scores a order
by a.score desc
) a) b
on a.score =
b.score
order
by b.rank
mysql
selectround(a.score, 2) as
score,
b.rank
from
scores a
join
(
select
a.*, (@rownum :=
@rownum
+1) as
rank
from
(
select
distinct
a.score
from
scores a
) a,
(select(@rownum :=
0)) b
order
bya.score
desc
) b
on a.score =
b.score
order
byb.rank
leetcode178 分數排名
sql架構 編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 例如,根據上述給定的 scores 表,你的查詢應該返回 按分數從高到低排列 排序score,找出有多少個scor...
leetcode 178 分數排名
sql架構 create table ifnot exists scores id int score decimal 3 2 truncate table scores insert into scores id,score values 1 3.5 insert into scores id,s...
LeetCode 178 分數排名
題目 編寫乙個 sql 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名 rank 相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有 間隔 表 scores id score 1 3.50 2 3.65 3 4.00 4 3.85 5 4.00 6 3.65 ...