2014-11-24 38 views
0

我正在實施asp.net中的評分系統。我有一張評分表。評分表的結構簡單,使用舊的AverageRating和新值計算新的平均值

表姓名:評分

Id  ProductId  RatingValue 
1   1    3.5 
2   1    3.0 
3   1    2.5 
4   2    4.0 

,而現在從我使用內置的AVG函數SQL表中選擇數據,

ISNULL(AVG([Rating].[RatingValue]), 0) 

這做工精細。現在,當用戶對數據庫中的同一產品再次進行評級時,我必須在Sql表「評級」中插入新的評級,並且必須用新的平均評級更新標籤控制。我可以在將記錄保存到數據庫表格後使用select語句來完成此操作,但是這會額外往返數據庫。現在我有舊的AverageRating值和產品評級的次數。

我現在有兩個選擇。

選項1:無論是從某種程度上INSERT語句中返回新AverageValue(我可以選擇標識列,但不知道我是否可以選擇列的平均與否)選項2

:使用舊AverageRating和應用程序中的CountRated值。我可以使用這些值的新評估值來計算運行時的新值。

哪個選項最好,以及如何實現它們?

回答

1

如果CountRated是時代的產物額定數量,RatingValue新的前值:

AverageRating = (AverageRating * CountRated + RatingValue)/(CountRated + 1); 

它可以比從所有數據重新計算平均水平,但它可能與很多不太準確數據。

+0

謝謝@Xaruth。它解決了我的問題。我必須首先檢查評級是否是第一次,然後在標籤中顯示原始的RatingValue,否則我使用您的公式。因爲如果評級是第一次,那麼CountRated和AverageRating的值就是0. – 2014-11-24 14:25:16

+0

我認爲你不需要,因爲第一次會是:'(0 * 0 + RatingValue)/(0 + 1)'。所以第一次,AverageRating = RatingValue。 – Xaruth 2014-11-24 14:29:14

+0

是的,你是絕對正確的。實際上,在此之前我爲了不同的目的遞增了RatingValue。 RatingCount ++ – 2014-11-24 14:35:11