SQL練習題46:牛客每次考試完,都會有一個成績表(grade),請你寫一個sql語句查詢各個崗位分數升序排列之后的中位數位置的范圍,並且按job升序排序


題目:

牛客每次考試完,都會有一個成績表(grade),如下:

 

 

第1行表示用戶id為1的用戶選擇了C++崗位並且考了11001分

。。。

第8行表示用戶id為8的用戶選擇了前端崗位並且考了9999分

 

 

請你寫一個sql語句查詢各個崗位分數升序排列之后的中位數位置的范圍,並且按job升序排序,結果如下:

 

解釋:

第1行表示C++崗位的中位數位置范圍為[2,2],也就是2。因為C++崗位總共3個人,是奇數,所以中位數位置為2是正確的(即位置為2的10000是中位數)

 

第2行表示Java崗位的中位數位置范圍為[1,2]。因為Java崗位總共2個人,是偶數,所以要知道中位數,需要知道2個位置的數字,而因為只有2個人,所以中位數位置為[1,2]是正確的(即需要知道位置為1的12000與位置為2的13000才能計算出中位數為12500)

 

第3行表示前端崗位的中位數位置范圍為[2,2],也就是2。因為前端崗位總共3個人,是奇數,所以中位數位置為2是正確的(即位置為2的11000是中位數)

 

 

 

(注意: sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才會得到0.5,sqlite四舍五入的函數為round,sqlite不支持floor函數,支持cast(x as integer) 函數,不支持if函數,支持case when ...then ...else ..end函數)

程序:

SELECT job,
CASE COUNT(*)%2 WHEN 1 THEN COUNT(*)/2+1 ELSE COUNT(*)/2 END AS s,
COUNT(*)/2+1 AS e
FROM grade
GROUP BY job;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM