每日一道SQL題(三)

2021-10-13 09:47:21 字數 2164 閱讀 2880

編寫乙個 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命令編輯 分 時 日 月 周...