SQL计算截断平均值和移动平均值

在SQL实际数值计算中,可能会遇到计算计算某一列去掉最大值和最小值后的平均值(截断平均值)或者计算字段前m条记录和后n条记录的平均值。

截断平均值

截断平均最常见的场景是去掉一个最大值和一个最小值计算平均值。计算中有两种思路:一是求整列的和减去最大值和最小值除以(列计数-2);二是利用窗口函数排名去掉第一名和最后一名(注意可能存在并列情况,使用row_number函数,另外窗口函数排名时不会自动忽略null值,需要把空值去掉或填充为0)

-- 去掉一个最大值,一个最小值计算平均值
select
    round((sum(score) - max(score) - min(score)) / (count(score) - 2), 1) as clip_avg_score
from test;

-- 使用窗口函数
select
    round(avg(score), 1) as clip_avg_score
from (select score,
      row_number() over(order by score) as t_rank_a,
      row_number() over(order by score desc) as t_rank_d
     from test 
     where score is not null)t
where t_rank_a != 1 and t_rank_d != 1

-- 空值填充为0
select
    round(avg(score), 1) as clip_avg_score
from (select score,
      row_number() over(order by ifnull(score,0)) as t_rank_a,
      row_number() over(order by ifnull(score,0) desc) as t_rank_d
     from test )t
where t_rank_a != 1 and t_rank_d != 1
移动平均值
-- 计算包含本条记录的前三条记录的平均值(向前移动二期)
select *,avg(计算字段) over(partition by 分组字段 order by 排序字段 rows between 2 preceding and current row) as 别名 from 表名;

-- 向前移动二期、向后移动二期
select *,avg(计算字段) over(partition by 分组字段 order by 排序字段 rows between 2 preceding and 2 following) as 别名 from 表名;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值