Mysql AVG函数 与手动sum 再除 count求出的平均值不一致问题

PigQuestions 2015-08-11 10:46:52
使用下列语句:
SELECT

IF (
AVG(`VALUE`) IS NULL,
0,
AVG(`VALUE`)
) AS avgValue
FROM
t_src_rtdb
WHERE
`NAME` = 'CZ3-A999'
AND (
SECONDS > 1351632073
AND SECONDS < 1351718473
)
AND `value` >= 0.50000000
AND `value` <= 5.00000000
得到的平均值为:2.8075127382092875
使用下面的语句:
SELECT count(*) from t_src_rtdb where `NAME` = 'CZ3-A999'' AND (SECONDS >= 1351632073 AND SECONDS < 1351718473) AND `VALUE` >=0.50000000 and `VALUE` <= 5.00000000;
SELECT sum(`VALUE`) from t_src_rtdb where `NAME` = 'CZ3-A999'' AND (SECONDS >= 1351632073 AND SECONDS < 1351718473) AND `VALUE` >=0.50000000 and `VALUE` <= 5.00000000;

得到数据分别为:
1440,4042.703461289406 两数相除等于:2.80743296 小数点4位以后的数字完全不一样了。
这是为什么呢?哪个算法是最准确的?


...全文
938 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rick-he 2015-08-11
  • 打赏
  • 举报
回复 1
[quote=引用 1 楼 yupeigu 的回复:] 这里要注意一点,就是 avg在计算的时候 不会考虑 字段中的null,比如: id 1 2 null 3 那么 sum=6,count(*) = 4(当然 如果是 count(id)=3 ),但是avg=6/3 = 2 而不是6/4 =1.5 , 所以avg实际上就是: avg(字段)=sum(字段)/count(字段) 而不是 sum(字段)/count(*)[/quote mysql是这样的
ACMAIN_CHM 2015-08-11
  • 打赏
  • 举报
回复
SELECT count(*) from t_src_rtdb where `NAME` = 'CZ3-A999'' AND (SECONDS >= 1351632073 AND SECONDS < 1351718473) AND `VALUE` >=0.50000000 and `VALUE` <= 5.00000000; 注意红色部分是两个单引号。显然楼主使用的语句并不一致。
LongRui888 2015-08-11
  • 打赏
  • 举报
回复
这里要注意一点,就是 avg在计算的时候 不会考虑 字段中的null,比如: id 1 2 null 3 那么 sum=6,count(*) = 4(当然 如果是 count(id)=3 ),但是avg=6/3 = 2 而不是6/4 =1.5 , 所以avg实际上就是: avg(字段)=sum(字段)/count(字段) 而不是 sum(字段)/count(*)
PigQuestions 2015-08-11
  • 打赏
  • 举报
回复
但是通过下面的语句: SELECT count(*) from t_src_rtdb where `NAME` = 'CZ3-A999' AND (SECONDS >= 1351632073 AND SECONDS < 1351718473) AND `VALUE` >=0.50000000 and `VALUE` <= 5.00000000 and ISNULL(`VALUE`) VALUE为空的字段个数为0,并不存在NULL值。 用 SELECT count(`VALUE`) from t_src_rtdb where `NAME` = 'CZ3-A999 AND (SECONDS >= 1351632073 AND SECONDS < 1351718473) AND `VALUE` >=0.50000000 and `VALUE` <= 5.00000000; SELECT sum(`VALUE`) from t_src_rtdb where `NAME` = 'CZ3-A999 AND (SECONDS >= 1351632073 AND SECONDS < 1351718473) AND `VALUE` >=0.50000000 and `VALUE` <= 5.00000000; 得到一样是 1440 和 4042.703461289406, 没有变化。依然是2.80743296,与AVG求出的数一不样。这是什么原因

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧