SQL練習(二) 排名問題

2021-08-05 21:23:21 字數 1955 閱讀 1532

leetcode--將分數進行排名,並按降序排列,其中分數相同排名也應相同。

輸入:

+----+-------+

| id | score |

+----+-------+

| 1 | 3.50 |

| 2 | 3.65 |

| 3 | 4.00 |

| 4 | 3.85 |

| 5 | 4.00 |

| 6 | 3.65 |

+----+-------+

輸出:

+-------+------+

| score | rank |

+-------+------+

| 4.00 | 1 |

| 4.00 | 1 |

| 3.85 | 2 |

| 3.65 | 3 |

| 3.65 | 3 |

| 3.50 | 4 |

+-------+------+

解題思路:

其中子查詢:

select s1.score, count(*) as rank

from

(select distinct score from scores) as s1,

(select distinct score from scores) as s2

where s1.score<=s2.score

group by s1.score

)

效果:

進一步拆解:

select s1.score , count(*)

s2.score

asrank

from

(select

distinct score from scores) as

s1, (

select

distinct score from scores) as

s2

where s1.score<=s2.score

效果:

可以看到,s1.score與s2.score進行<=操作之後,得到了這樣的結果,我們知道,倆字段的比較操作,會將左邊表的字段依次與右邊表的字段值逐個比較,這裡我們可以看到,對於左表的3.5來說,右邊表有四個值滿足<=的比較條件,於是,左邊表的3.5會出現4次,而右邊的值則是滿足比較條件的值。

於是,當所有的字段比較完成之後,我們可以總結出,因為每乙個欄位在右邊去比較的時候,總會將比其小的值篩乙個出去(因為是distinct操作,不會存在重複值),這麼一來,左邊表的字段的值每迭代到乙個更大的值,其在結果集中出現的次數一定比上乙個次小值少一次,最後將其做group by操作,這麼一來,就得到了「排序」效果。

sql2005排名函式

goselect name,rank over order by name from tb 序號不連續,相同的值的序號相同,接下來的乙個值不相同的序號為前面的行數 1 select name,rank over partition by name order by name from tb 按nam...

題目1014 排名

題目描述 今天的上機考試雖然有實時的ranklist,但上面的排名只是根據完成的題數排序,沒有考慮每題的分值,所以並不是最後的排名。給定錄取分數線,請你寫程式找出最後通過分數線的考生,並將他們的成績按降序列印。輸入 測試輸入包含若干場考試的資訊。每場考試資訊的第1行給出考生人數n 0 n 1000 ...

題目1014 排名

題目描述 今天的上機考試雖然有實時的ranklist,但上面的排名只是根據完成的題數排序,沒有考慮每題的分值,所以並不是最後的排名。給定錄取分數線,請你寫程式找出最後通過分數線的考生,並將他們的成績按降序列印。輸入 測試輸入包含若干場考試的資訊。每場考試資訊的第1行給出考生人數n 0 n 1000 ...