編寫乙個 sql 查詢來實現分數排名。
如果兩個分數相同,則兩個分數排名(rank)相同。請注意,平分後的下乙個名次應該是下乙個連續的整數值。換句話說,名次之間不應該有「間隔」。
題目鏈結
idscore
13.50
23.65
34.00
43.85
54.00
63.65
例如,根據上述給定的 scores 表,你的查詢應該返回(按分數從高到低排列):
score
rank
4.00
14.00
13.85
23.65
33.65
33.50
4看到排名就要想到的三個視窗函式
rank() 間斷不連續
dense_rank() 連續
row_number() 行號
根據題目要求名次是乙個連續的整數值,所以使用dense_rank() 即可。
**如下(示例):
select
score
,dense_rank(
)over
(order
by score desc)as
"rank"
from scores
如果想不起來視窗函式還可以使用子查詢
思路:根據題意拆分成兩部分
降序排列的分數
select
score
from scores
order
by score desc
分數對應的排名
如何獲得分數對應的排名呢?假設分數為s,分數集合為h
因為排名是連續的,所以s的名次應該是h中大於等於s的分數去重計數的結果(去重後的分數的個數)
# 大於分數s的集合h1
select score from scores where score >= s;
# 對h1去重計數
select
count
(distinct score)
from scores where score >= s;
將1、2結合
#每次從a表中取乙個分數都與b表進行比較,b表中大於a的去重的分數的個數就是a的排名
select
a.score,(
select
count
(distinct b.score)
from scores as b where b.score >= a.score)
as"rank"
from scores as a
order
by a.score desc
**示例:
# 獲得每個不同的分數的名次
select
t1.score
,@rank :=
@rank+1
as"rank"
from
(select
distinct score as score from scores order
by score desc
) t1
(select
@rank :=
0) t2
# 主表與上述的中間表join求得所有分數的排名
select
s.score
,t.rank as
"rank"
from scores as s
inner
join
(select
t1.socre
,@rank :=
@rank+1
as"rank"
from
(select
distinct score as score from scores order
by score desc
)as t1
(select
@rank :=0)
as t2
)as t
on s.score = t.score
order
by s.score desc
本題主要考察排序的視窗函式 每日一道演算法題
no.1 設指標變數fron t表示鏈式佇列的隊頭指標,指標變數rear表示鏈式佇列的隊尾指標,指標變數s指向將要入佇列的結點x,則入佇列的操作序列為 a.front next s front s b.s next rear rear s crear next s rear s d.s next f...
每日一道演算法題
no.1 若有 18 個元素的有序表存放在一維陣列 a 19 中,第乙個元素放 a 1 中,現進行二分查詢,則查詢 a 3 的比較序列的下標依次為 a.1,2,3 b.9,5,2,3 c.9,5,3 d.9,4,2,3 答案 d.第一次查詢,隊首為下標1,隊尾下標18,所以是 1 18 2 9 第二...
每日一道Linux題
no.1 以下的命令得在 自動執行 06 03 3 lp usr local message mail s server message root a.每週三06 03分 b.每週六03 03分 c.每週三03 06分 d.每週六03 06分 答案 c 使用crontab命令編輯 分 時 日 月 周...