题目
-
题目来源: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
SQL查询中位数排名与窗口函数应用
本文详细介绍了如何使用SQL查询各个岗位分数的中位数位置上的grade信息,通过窗口函数实现行内排序和分组,同时展示了WHERE子句中条件语句的运用,确保结果按ID升序排列。重点讲解了如何处理奇偶数分组情况,以及如何结合OR或IN操作符进行行过滤。
300

被折叠的 条评论
为什么被折叠?



