我们有一个大的数据表,用于返回总平均价格,但处理此查询和其他查询需要很长时间,因此我们按国家和日期夸大了结果。
这是原始表格的一个示例:
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(价格(|||
---|---|---|---|---|
IND | 21.315 | 7.105 | 32021-01-01//tr>||
美国 | 14.582 | >4.86066667 | 3 | 2021-01-02 |
AUS | 1.638 | 3.069 | 2 | 2021-01-03 |
您有两个选项
A: 使用另一个只得到平均值而不返回行的查询
B: 获取每个国家的所有价格总和和每个国家的记录数。然后你可以通过将所有价格总和除以所有记录计数来获得平均值