with
    ranked_data as (
        select
            id,
            job,
            score,
            dense_rank() over (
                partition by
                    job
                order by
                    score desc
            ) as t_rank,
            row_number() over (
                partition by
                    job
                order by
                    score desc
            ) as row_num
        from
            grade
    ),
    median_position as (
        select
          job,
          floor((count(*)+1)/2) as median1,
          floor((count(*)+2)/2) as median2
        from grade
        group by job
    )
    
select id,r.job,score,t_rank
from  ranked_data r inner join median_position p on 
r.job=p.job
where r.row_num=p.median1 or r.row_num=p.median2
order by id 

1、按照分数进行排序。使用dens_rank()生成名次排序,row_number()进行顺序编号。

2、确定中位数的位置。这个中位数为分数的中位数,所以需要按照分数进行排序。