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 ...