題目:
牛客每次考試完,都會有一個成績表(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;