[英]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.