如何在聚合和非聚合数据集上获取相同的 AVG() 值



我们有一个大的数据表,用于返回总平均价格,但处理此查询和其他查询需要很长时间,因此我们按国家和日期夸大了结果。

这是原始表格的一个示例:

Country   |  code | Price | Date 
--------------------------------------
IND       |  XXZ  | 7.435 | 2021-01-01
IND       |  XSZ  | 7.445 | 2021-01-01
IND       |  XAZ  | 6.435 | 2021-01-01
USA       |  XYN  | 2.524 | 2021-01-02
USA       |  AYD  | 9.524 | 2021-01-02
USA       |  XYD  | 2.534 | 2021-01-02
AUS       |  YYB  | 1.819 | 2021-01-03
AUS       |  YSB  | 4.319 | 2021-01-03
--------------------------------------
AVG(Price) = 5.254375
SELECT AVG(Price) from table

5.254375中的结果

为了优化针对该记录集的所有查询,我们使用以下表达式聚合表:

SELECT country,sum(price),Avg(price),date 
FROM table 
GROUP BY country,date
Country |  sum(Price)| AVG(Price) | Date 
----------------------------------------------
IND     |  21.315    | 7.105      | 2021-01-01
USA     |  14.582    | 4.86066667 | 2021-01-02
AUS     |  1.638     | 3.069      | 2021-01-03
-----------------------------------------------
Avg = 5.011555557

当我采用Avg(Avg(Price)) = 5.011555557时,该值与非聚合数据的AVG(价格(=5.254375不匹配。

然而,现在在报告中,我们仍然希望能够显示正确的平均数字,但我们不能使用原始表,因为电子查询处理时间太长。

我们如何仅使用这个汇总记录集来计算总体平均价格?

这与SQL没有太多关系,而是简单的数学。

您需要使用原始计数来重新生成以更正TOTAL/COUNT表达式。

我们可以从总数中计算出,它很容易出现舍入误差,但理想情况下,如果这对你来说非常重要,那么你应该记录原始计数。

SELECT country, sum(price), Avg(price), Count(1), date 
FROM table GROUP BY by country, date
AVG(价格(32021-01-01//tr>>
国家合计(价格(
IND21.3157.105
美国14.5824.8606666732021-01-02
AUS1.6383.06922021-01-03

您有两个选项

A: 使用另一个只得到平均值而不返回行的查询

B: 获取每个国家的所有价格总和和每个国家的记录数。然后你可以通过将所有价格总和除以所有记录计数来获得平均值

相关内容

  • 没有找到相关文章

最新更新