postgresql - SQL avg() 不正确

标签 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;

最佳答案

好的,让我们记住学校算术。您在两个查询中都有 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/

相关文章:

php - 在查询中连接两个 SQL 表

postgresql - 将 postgresql 转储导入 Heroku

sql - 获取错误 : Column does not exist

postgresql - Postgres 触发器函数

postgresql - 在 postgres 中使用 table.column%type-argument 获取关于函数的元数据

sql - 在特定行的值之后拆分表

sql - 如何通过 SQL 表进行访问控制?

ruby-on-rails - rake 数据库 :create throws "database does not exist" error with postgresql

Django 尝试写入生成的列

sql - 将两个查询合并为一个