【问题标题】:Edit rating of cumulative average编辑累积平均评分
【发布时间】:2015-02-14 02:33:28
【问题描述】:

来自这个question的关于累积平均值。

答案看起来不错。但是,如果用户可以编辑评级,我正在尝试查找是否可以使用相同的方法。我试图知道接受答案的用户的想法,但他没有回复。所以我正在创建一个新问题。

每次获得新评分时,更新累积平均值并 评分计数:

new_count = old_count + 1 
new_average = ((old_average * old_count) + new_rating) / new_count

如果用户可以编辑评分:

new_count = old_count // With a rating edit, the count will be the same
new_average = ?

【问题讨论】:

    标签: sql algorithm math logic rating


    【解决方案1】:

    执行此操作的正确方法是保持运行总和 S 并计数 C。添加新评级R时,更新规则如下。

    (S, C) <- (S + R, C + 1)               | When a new rating R is added.
    (S, C) <- (S - R, C - 1)               | When a rating R is removed.
    

    要随时获取平均值,只需评估S / C。当修改属于S 的评级时,更新如下,其中R0 是旧评级,R1 是新评级。

    (S, C) <- (S - R0 + R1, C)             | When rating R0 is changed to R1.
    

    没有理由将您的数据存储为平均A 和计数C。它只会使更新更加复杂。

    (A, C) <- ((CA + R) / (C + 1), C + 1)  | When a new rating R is added.
    (A, C) <- (A + (R1 - R0) / C, C)       | When rating R0 is changed to R1.
    

    【讨论】:

    • 我仍在努力。但是,您如何通过这种类型的实现按评级下订单呢?我没有 db 字段可以通过 avg_rating 下订单。我正在使用 sql achmemy。谢谢
    • @user2990084 为此,我将有第三列,以便您的列是 Sum、Count 和 Average。 Sum 和 Count 如上所述更新。每次更新时都会根据 Sum 和 Count 重新计算平均值。将平均值视为从 Sum 和 Count 派生的,这样您就永远不会直接修改 Average 列。如果这样做,您将能够按平均列排序。
    • 显然我可以按顺序做S/C。所以我可以避免列平均值。谢谢!
    【解决方案2】:

    你必须减去旧值并添加新值:

    new_average = old_average + (new_rating - old_rating) / count
    

    这意味着您必须将所有旧评级存储在某个地方。但是,如果您的用户要编辑它们,那么您可能在某处拥有旧值。

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 2012-06-19
      • 2022-01-04
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多