【问题标题】:How do i calculate Ranks based on score?如何根据分数计算排名?
【发布时间】:2021-09-13 05:46:24
【问题描述】:

有一个平台,我们可以根据用户的积分对他们进行排名。假设有大约 10,000 个条目。数据库如下所示。

Id UserName Points Rank
0 Archit 0 4
1 Archit1 15 1
2 Archit2 10 2
3 Archit3 5 3

每当有人执行某项操作时,他们的分数会增加或减少,基于此,我还需要更新数据库中的排名。但问题是,每次有人采取行动时,一次又一次地更新它是一个非常缓慢的过程。 而且在个人资料上显示排名的同时计算排名也不是一个好方法。

这样的问题的理想解决方案应该是什么?

【问题讨论】:

    标签: database data-structures


    【解决方案1】:

    为了提高效率,你应该只改变排名,而不是每次都重新计算整个数据。

    由于您没有指定编程语言,这里是一个示例伪代码:

    -- input variables: CurrID, PointChange
    CurrRank = Rank[CurrID]
    Points[CurrID] = Points[CurrID] + PointChange
    CurrPoints = Points[CurrID]
    NewRank = SELECT count(Id) From YourTable where Points >= CurrPoints
    if NewRank > CurrRank Then
      update YourTable Rank = Rank - 1 where Rank > CurrRank And Rank <= NewRank
    else
      update YourTable Rank = Rank + 1 where Rank <= CurrRank And Rank > NewRank
    end if
    Rank[CurrID] = newRank
    

    【讨论】:

    • 如果有一个人A位列第一,B位位列第二位,C位位列第三位,C位获得分数,位阶变为第一位。现在你的意思是我应该只更新 C 人和 A 人。介于两者之间的人 B 会发生什么?从逻辑上讲,我 B 也应该更新。
    • 我不是只说A和C。如果你有变化,比如排名第3到第8,那么你需要改变原来排名在第3到第8之间的每个人(但不要改变排名第 1 位、第 2 位和第 9 位到最后)。这也是代码的作用。
    • 哦,好的,知道了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多