SQL求处于中位数上的成绩

数据

drop table if exists grade;
CREATE TABLE  grade(
`id` int(4) NOT NULL,
`job` varchar(32) NOT NULL,
`score` int(10) NOT NULL,
PRIMARY KEY (`id`));

INSERT INTO grade VALUES
(1,'C++',11001),
(2,'C++',10000),
(3,'C++',9000),
(4,'Java',12000),
(5,'Java',13000),
(6,'B',12000),
(7,'B',11000),
(8,'B',9999),
(9,'B',10002);

在这里插入图片描述

利用窗口函数增加三列

select *,
       count(score) over(partition by job) as total,
       row_number() over(partition by job order by score) as ascend, #升序序号
       row_number() over(partition by job order by score desc) as descend #逆序序号
    from grade

在这里插入图片描述

利用这三列数求出处于中位数的数据(完整代码)

with t_rank as
(
    select *,
       count(score) over(partition by job) as total,
       row_number() over(partition by job order by score) as ascend, #升序序号
       row_number() over(partition by job order by score desc) as descend #逆序序号
    from grade
)
 
select id,job,score,descend
from t_rank
where ascend >= total/2 and descend >= total/2
order by id

在这里插入图片描述

牛客原题

https://www.nowcoder.com/practice/b626ff9e2ad04789954c2132c74c0512?tpId=82&&tqId=35496&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值