SQL練習74:考試分數(三)
題目鏈接:牛客網
題目描述
牛客每次舉辦企業筆試的時候,企業一般都會有不同的語言崗位,比如C++工程師,JAVA工程師,Python工程師,每個用戶筆試完有不同的分數,現在有一個分數(grade)表簡化如下:

第1行表示用戶id為1的選擇了language_id為1崗位的最后考試完的分數為12000,
…
第7行表示用戶id為7的選擇了language_id為2崗位的最后考試完的分數為11000,
不同的語言崗位(language)表簡化如下:

請你找出每個崗位分數排名前2的用戶,得到的結果先按照language的name升序排序,再按斬訓分降序排序,最后按照grade的id升序排序,得到結果如下:

解法
根據題目的要求可以使用dense_rank()視窗函式,按照language_id進行磁區,score降序排列,再將grade表與language表連接,獲取name值,
SELECT g.id, name, score, dense_rank() over(partition by language_id ORDER BY score DESC) s_rank
FROM grade g JOIN language l
ON g.language_id = l.id
| id | name | score | s_rank |
|---|---|---|---|
| 2 | C++ | 13000 | 1 |
| 1 | C++ | 12000 | 2 |
| 6 | C++ | 11000 | 3 |
| 3 | JAVA | 11000 | 1 |
| 7 | JAVA | 11000 | 1 |
| 4 | JAVA | 10000 | 2 |
| 5 | Python | 11000 | 1 |
2.有了上面的結果集,直接按照題目的要求查詢排名前二的資料,再按照name升序排列即可,
SELECT id, name, score
FROM (SELECT g.id, name, score,
dense_rank() over(partition by language_id ORDER BY score DESC) s_rank
FROM grade g JOIN language l
ON g.language_id = l.id) r1
WHERE r1.s_rank <= 2
ORDER BY name
| id | name | score |
|---|---|---|
| 2 | C++ | 13000 |
| 1 | C++ | 12000 |
| 3 | JAVA | 11000 |
| 7 | JAVA | 11000 |
| 4 | JAVA | 10000 |
| 5 | Python | 11000 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260010.html
標籤:其他
上一篇:Linux基礎篇
