题目
-
题目来源:SQL76 考试分数(五)
-
题目描述
写一个sql语句查询各个岗位分数的中位数位置上的所有grade信息,并且按id升序排序 -
一张表
-
所需结果
题解
思路:
结果中的前三个字段来自原表,多的一个是组内分数的排名。
所以根据条件进行行过滤即可,大致思路是通过排序窗口函数去筛选:
分组为奇数输出一行,分组为偶数输出两行;
使用窗口函数获取分组总数,以及排行信息;
使用WHERE 进行 行过滤
SELECT t.id,
t.job,
t.score,
t.rk t_rank
FROM (SELECT *,
ROW_NUMBER() OVER(PARTITION BY job ORDER BY score DESC) rk, # 注意下分数是按照从高到低排列
COUNT(*) OVER(PARTITION BY job) cnt
FROM grade
) t
WHERE rk = IF(t.cnt % 2 = 0, t.cnt / 2, CEILING(t.cnt / 2))
OR rk = IF(t.cnt % 2 = 0, t.cnt / 2 + 1, CEILING(t.cnt / 2)) # 也可以用 IN 取代 OR操作
ORDER BY t.id
指的注意的是,这题在WHERE
中使用了条件语句,如要表示多个条件的并集,可以使用 OR
并列条件,或者使用 IN
。
还有一点细节,组内是按照分数从高到低的排序方式,即使用DESC