簡體   English   中英

如何在聚合和非聚合數據集上獲得相同的 AVG() 值

[英]How to get the same value of AVG() on both aggregated & non-aggregated dataset

我們有一個用於返回總平均價格的大型數據表,但是這個查詢和其他查詢需要很長時間才能處理,以至於我們按國家和日期匯總了結果。

這是原始表的示例:

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(Price) = 5.254375 不匹配。

但是現在在報告中,我們仍然希望能夠顯示正確的平均數字,但是我們不能使用原始表,因為查詢處理時間太長。

我們如何僅使用此匯總記錄集來計算總體平均價格?

這與 SQL 並沒有太大關系,而是簡單的數學運算。

您需要使用原始計數來重建以更正TOTAL/COUNT表達式。

我們可以從總數中計算出,它很容易出現舍入誤差,但它已經接近了,理想情況下,如果這對您來說非常重要,那么您應該記錄原始計數。

SELECT country, sum(price), Avg(price), Count(1), date 
FROM table GROUP BY by country, date
國家 總和(價格) 平均(價格) 數數 日期
IND 21.315 7.105 3 2021-01-01
美國 14.582 4.86066667 3 2021-01-02
澳大利亞 1.638 3.069 2 2021-01-03

或者我們可以重新構造計數:

SELECT Country, totalPrice, avePrice, totalPrice/avePrice, Date
FROM AggregatedValues

_results 與上面的表相同。

但我們不能只使用 AVG,因為它使用結果中的行數,相反我們應該自己評估平均值:

SELECT SUM(sumPrice) / SUM(sumPrice/avePrice) FROM AggregatedValues

或者您是否存儲了計數

SELECT SUM(sumPrice) / SUM(Count) FROM AggregatedValues

在 sql 小提琴中查看: http://sqlfiddle.com/#!18/818872/7

我在該數據集中看到了您的日期列,因此我們仍然可以使用 group by 在日期上匯總聚合值:

SELECT date, SUM(sumPrice) / SUM(sumPrice/avePrice) 
FROM AggregatedValues
GROUP BY date;
日期 大道
2021-01-01T00:00:00Z 5.254376

http://sqlfiddle.com/#!18/818872/9

現在最終,平均值不是您期望的5.254375 ,這是由於存儲聚合值時精度損失,如果您存儲了原始計數,我們將盡可能接近:

更新了小提琴,我原來的例子失去了精度!

但這也凸顯了這種類型的反向平均永遠不可能像使用原始集合那樣准確!

http://sqlfiddle.com/#!18/27e7c/1

SELECT date, SUM(sumPrice) / SUM([count]) 
FROM AggregatedValues
GROUP BY date;
日期 大道
2021-01-01T00:00:00Z 5.254375

你有2個選擇

A:使用另一個只獲取平均值且不返回行的查詢

B:獲取每個國家/地區所有價格的總和和每個國家/地區的記錄數。 然后您可以通過將所有價格總和除以所有記錄數來獲得平均值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM