SQL avg()不正确

时间:2019-06-18 18:26:07

标签: postgresql

第一个表是原始数据,第二个表是第一个表中数字的平均值。平均值应为733.43,但现在为760.57575。谁能帮助我了解为什么这些数字不同?

Queries

我知道还有其他类似的问题,但这比那些要简单得多。

编辑: 以下查询解决了我的问题

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;

1 个答案:

答案 0 :(得分:2)

好的,让我们记住学校的算术。您在两个查询中都具有​​avg(),并且假设第一个查询的平均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(只需检查)