第一个表是原始数据,第二个表是第一个表中数字的平均值。平均值应该是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(),并且假设第一个查询的平均值之和除以其中的行数,等于实际值之和除以实际行数。类似于:
Firs查询:

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/

10-15 18:22