这道题目要求我们查询每个岗位的分数中位数位置范围。我们要做的事情如下:

1. 确定总体问题

我们需要计算每个岗位的分数中位数位置范围,并按岗位名称升序排序。

具体来说,我们需要计算每个岗位的分数升序排列后的中位数位置,并按岗位名称升序排序输出。中位数位置的范围取决于岗位人数的奇偶性:如果人数是奇数,中位数位置是一个数;如果人数是偶数,中位数位置是两个数。

2. 分析关键问题

  • 计算岗位人数:使用COUNT函数计算每个岗位的总人数。
  • 确定中位数位置范围:根据岗位人数的奇偶性确定中位数位置范围。
  • 排序输出:按岗位名称升序排列输出结果。

3. 解决每个关键问题的代码及讲解

步骤1:计算岗位人数

我们使用COUNT函数计算每个岗位的总人数:

count(*)
  • COUNT(*): 计算每个岗位的总人数。
步骤2:确定中位数位置范围

我们使用CASE语句根据岗位人数的奇偶性确定中位数位置范围:

round(count(*)/2,0) as start,
round((case when count(*)%2!= 0 then count(*)/2 else count(*)/2+1 end),0) as end
  • 无论个数是奇数还是偶数,中位数的起始位置等于个数/2,如果个数是奇数,结束位置等于个数/2,否则结束位置等于个数/2+1。
  • ROUND(COUNT(*)/2, 0) AS start: 计算中位数位置的起始位置。
  • ROUND((CASE WHEN COUNT(*)%2 != 0 THEN COUNT(*)/2 ELSE COUNT(*)/2 + 1 END), 0) AS end: 计算中位数位置的结束位置。
步骤3:排序输出

我们按岗位名称升序排列输出结果:

order by job
  • ORDER BY job: 按岗位名称升序排列。

完整代码

select
    job,
    round(count(*)/2,0) as start,
    round((case when count(*)%2!= 0 then count(*)/2 else count(*)/2+1 end),0) as end
from
    grade
group by
    job
order by job;