第一个表是原始数据,第二个表是第一个表中数字的平均值。平均值应该是 733.43,但现在是 760.57575。谁能帮我理解为什么这些数字不同?
我知道还有其他类似的问题,但这比那些简单得多。
编辑: 以下查询解决了我的问题
SELECT st.begin_ts, sum(st.count) / count(st.count) as average
FROM (
SELECT begin_ts, process_name, avg(count) as count
FROM ecn_stats_2019_06_18
WHERE process_name LIKE 'matching_%_gw' and name = 'raw_msg_count' and begin_ts <= '2019-06-18 07:00:00'
GROUP BY begin_ts, process_name) as st
GROUP BY begin_ts;
最佳答案
好的,让我们记住学校算术。您在两个查询中都有 avg()
并且您假设第一个查询的平均值之和除以其中的行数将等于实际值的总和除以实际行数。像这样的东西:
第一个查询:
row1, (a + b) / 2
row2, (c + d + e) / 3
第二个查询,你认为应该返回
((a + b) / 2 + (c + d + e) / 3) / 2
是吗?让我们展开最后一个表达式:
((a + b) / 2 + (c + d + e) / 3) / 2 = (a + b) / 4 + (c + d + e) / 6 = a/4 + b/4 + c/6 + d/6 + e/6
但是你的第二个查询实际上计算出类似的东西
(a + b + c + d + e) / 5 = a/5 + b/5 + c/5 + d/5 + e/5
这显然不等于前一个。
例子:
with t(a, b, c) as (values(1,1,2.0), (1,1,3.0), (1,2,4.0), (1,2,5.0), (1, 2, 6.0))
select a, avg(c) from t group by a, b;
a | avg
---+--------------------
1 | 5.0000000000000000
1 | 2.5000000000000000
(2 rows)
根据你假设的查询结果
with t(a, b, c) as (values(1,1,2.0), (1,1,3.0), (1,2,4.0), (1,2,5.0), (1, 2, 6.0))
select a, avg(c) from t group by a;
应该是 (5 + 2.5)/2 = 3.75
但实际上是 4
(检查一下)
关于postgresql - SQL avg() 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56654997/