mysql查询中位数问题

在项目开发报表的时候遇到了一个问题,需要统计表中,数据的平均值和中位数。

mysql给的函数中,有求平均值的函数AVG,但是没有求中位数的函数。从网上搜了一些,感觉比较复杂,这个时候咱们可以用一个巧妙的骚操作来解决。

中位数就是一组数据中间的那个值,这个时候咱们可以先排序数据,排序以后,中间的那个值就是中位数了。

当数据总量是奇数的时候,中间的就是中位数,比如有 5个数据,则排序以后第三个就是中位数。当数据总量是偶数的时候,这个时候咱们规定,取中间靠下的那个记录为中位数。比如当总记录数是6个的时候咱们取第3个数据,总记录数是8的时候咱们去第4个数据。实际上这里也可以改动一下,取出来中间的两个数据,都当做中位数,或者求两个的平均值当中位数。

下面是sql,大家可以根据自己的表设计稍作改动。

总体思路就是先根据某一个数值列去排序${orderColumn},然后查出来行号,和总记录数。这个查询当做子查询,在外侧在套一层查询,查询行号,是总记录数一半的那条记录。当总记录数是奇数的时候count/2是个小数,所以这里用了一个向上取整的函数。

select * from (
        select  (@rownum := @rownum + 1) rownum, c.num, s.*
        from zkx_safety_assess_value s,
        (select @rownum := 0) r,
        (SELECT COUNT(1) num from zkx_safety_assess_value where type = #{type} ) c
        where s.type = #{type}
        order by ${orderColumn}
) tab
where tab.rownum = CEILING(tab.num/2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值