求教SQL面試題目:單張表查詢某欄位排在第二或第n-1問題?
最近面試遇到一個SQL問題,到現在自己沒解決出來,求教。題目如下:
表結構如圖:問題如下:問題一:查詢數學課程成績最高的學生記錄?問題二:查詢數學課程成績排在第二的學生記錄?
問題一的解答相對簡單,我是寫出來了,我的寫法是但是問題2,很慚愧啊,到現在還沒寫出來,麻煩高手寫幾個,給小弟學習學習,在此感謝!
select * from student_score where score =(select MAX(score) from student_score s where s.course="數學") and course = "數學";或
select * from student_score s where s.score in (select MAX(s1.score) from student_score s1 where s1.course = s.course ) and s.course = "數學";
給題主提出表揚,並且希望知乎上水平比較低的題主向本題的題主學習。
題主寫出了自己的代碼。如果沒有這2行代碼的話,會被我當成伸手黨直接拉黑了。下面正經回答問題:問題一:SELECT * FROM student_score
WHERE course="數學"
ORDER BY score DESC
LIMIT 1
問題二:
SELECT * FROM student_score
WHERE course="數學"
ORDER BY score DESC
LIMIT 1 OFFSET 1
老版本上不支持OFFSET的寫法:
SELECT * FROM student_score
WHERE course="數學"
ORDER BY score DESC
LIMIT 1, 1
樓主你對於第一個問題的回答是正確的。
@劉項 的兩個回答都是錯的,因為沒有考慮到有可能兩個人會有相同的分數。對於第二個問題應該這樣解決:select *
from student_score
where course = "數學"
and score = (
select distinct score
from student_score
where course = "數學"
order by score desc
limit 1, 1
)
借鑒了stackoverflow的最高票答案:puzzle - What is the simplest SQL Query to find the second largest value?
之前答案忘了course=數學這一限定條件。謝謝 @王潤中 指正SELECT * FROM student_score
WHERE score=(SELECT MAX(score)
FROM student_score
WHERE score&< SELECT MAX(score)
FROM student_score
WHERE course="數學"
AND course="數學")
菜鳥剛學習,試著做了一下:
第一個:SELECT Top 1 *
FROM (SELECT * FROM CHENGJI11 WHERE course="數學")dORDER BY SCORE DESC第二個:SELECT *FROM(SELECT ROW_NUMBER()OVER(PARTITION BY COURSE ORDER BY SCORE DESC) XUHAO,
*FROM CHENGJI11) FWHERE XUHAO=2 AND course="數學"有幾位朋友已經給過答案了,我也在學習sql過程中,嘗試一下,用了窗口函數,不同窗口函數排序規則不一樣,我想樓主應該是dense_rank()這種排序規則;
select id,name,course,score
from(
select id,name,course,score
,row_number() over (partition by course order by score desc ) as row_number
,rank() over (partition by course order by score desc ) as rank
,dense_rank() over (partition by course order by score desc ) as dense_rank
from temp_mobile.sql_exc
)a
where course="數學" and dense_rank=1 --這裡改幾就可以提取第幾名的信息
第一種方法:排序後篩選
第二種方法:
1、查出最高分的記錄2、查出排除最高分記錄剩餘記錄的最高分 score3、查出分值等於score的記錄試試新寫法也不知道可不可以
select * from (
select id,name,course,score,rownumber()over(partition by course order by score desc) as rank from student_score )
where course="數學" and rank=2
第二問第一步先查出前2的記錄第二步在第一步的結果里查出正序的第一條就是了。如果要查排名第N的記錄,只需要修改第一步里的2。
select * from student_score where course="數學" order by score desc limit 1,1
沒在電腦試過不知道有沒有問題,歡迎指教另外推薦w3resource練習mysql,各位要是有各種mysql題目熱烈歡迎討論,性能優化什麼的就算了。。。至於同分的問題的話,容我想想。。你查查關鍵字limit、order byPS:我也是新手
推薦閱讀:
※像Mysql和SQL Server這類資料庫都有相應的圖形化管理工具,例如phpmyadmin等。除了更能全面了解資料庫信息和操作簡便之外,圖形化工具還有什麼不易被人發現的好處?
※資料庫預編譯為何能防止SQL注入?
※連續簽到獎勵 資料庫如何設計?
※怎麼樣從 web 開發人員轉成 DBA ?
※數據量很大,邏輯不能在內存里做怎麼辦?