SQL Server 关于求中位数的一个解决方案

sql server中并没有内置求中位数的聚合函数,所以我们需要自己写sql语句

样表如下:

create table My_test 			--学生成绩表
(
id int primary key identity,
stu_No int,						--学号
stu_Name nvarchar(10),			--姓名
times int,						--第几次考试
stu_Score int					--成绩
)

学生成绩表
现在要求计算每名学生成绩的中位数

利用ROW_NUMBER() OVER函数分组并编号
count(*)统计每个学生总考试次数

select * into #temp 
from (select *,
row_number() over (partition by stu_No,stu_Name order by stu_Score desc) as group_idex,
count(*) over (partition by stu_No) as total_times
from My_test) as s

在这里插入图片描述
完成编号之后求中位数就很轻松了,根据group_idex与total_times来确定

select stu_No,stu_Name,stu_Score as med_Score from #temp where total_times%2<>0 and group_idex=(total_times+1)/2 
--考试次数为奇数的中位数
union
select t.stu_No,t.stu_Name,(t.stu_Score+s.stu_Score)/2.0 as med_Score from 
(select * from #temp where total_times%2=0 and group_idex=total_times/2) as t,
(select * from #temp where total_times%2=0 and group_idex=total_times/2+1) as s
where t.stu_No=s.stu_No and t.stu_Name=s.stu_Name
--考试次数为偶数的中位数

drop table #test

在这里插入图片描述
如有错误,欢迎各位大佬指正

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一身都是月儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值