使用旧的AverageRating和New Value计算新的Average

时间:2014-11-24 14:07:43

标签: asp.net sql-server-2008 c#-4.0

我正在asp.net中实施评级系统。我有一张评级表。评级表的结构很简单,

表名:评级

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

现在,当从sql表中选择数据时,我使用内置的AVG函数,

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

这项工作很好。现在,当用户在数据库中再次对同一产品进行评级时,我必须在Sql表“Rating”中插入新的评级,并且必须使用新的平均评级更新标签控件。我可以通过在数据库表中保存记录后使用select语句来执行此操作,但这将是对数据库的额外往返。现在我有Old AverageRating值和产品评级的次数。

我现在有两个选择。

选项1:以某种方式从Insert语句中返回新的AverageValue(我可以选择标识列但不知道我是否可以选择列的平均值)

选项2:在应用程序中使用旧的AverageRating和CountRated值。我可以使用这些值的新值来计算运行时的新值。

哪种选择最好,如何实现?

1 个答案:

答案 0 :(得分:1)

如果CountRated是产品评分的次数,则在RatingValue的新值之前:

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

它可能比重新计算所有数据的平均值更快,但对于大量数据而言可能不太准确。