在项目开发报表的时候遇到了一个问题,需要统计表中,数据的平均值和中位数。
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)