我正在开发一个新的网站,有一些“实体”投票。
每次投票都可以是1到5之间的数字,其中1票是最差的,5票是最好的。
现在,在同一个网站上,我有一个“受欢迎的实体图表”,其中我列出了最受欢迎的“实体”基于他们的投票。
现在,我不能做一个简单的算术平均数,因为一个“实体”的一票为5,可以有相同的排名,一个“实体”的100票为5。
我考虑过为每个“实体”存储不是算术平均值,而是投票数,并在SQL查询中按投票数和算术平均值排序,但在这之后,一个投票数为1的实体可能会受到欢迎(当它不受欢迎时)。
我可以用什么算法?

最佳答案

对于一个基本的解决方案,尝试从两个平均值相同的实体中选择order by [average vote] desc, [vote count] desc,100票的实体将高于1票的实体,但平均值为4.5的实体将永远不会高于平均值为5的实体。
编辑1
如果你想100票平均4.5票而10票平均5票,为什么不忽略1票、2票和3票,或[4票和5票计数]-[1票和2票计数]这样,正票数将使实体的排名上升。
编辑2
你可能会特别重视最近的投票。实体的某些内容可能已经更改,从而更改了用户对它的看法可能会建立上个月的另一个平均投票数,并以此为基础调整最终排名。
编辑3
计算一个[popularityScore]列并按它排序怎么样?

-- sum instead of average
-- square root of sum will reduce importance of vote count a bit
select
    entity,
    sqrt(sum(vote - 3)) as popularityScore
from Votes
group by entity
order by rank desc

-- 50 votes of 5 -> popularityScore = 12.25
-- 100 votes of 4 -> popularityScore = 10
-- 200 votes of 4 -> popularityScore = 14.14
-- 2000 votes of 4 -> popularityScore = 44.72
-- 2000 votes of 5 -> popularityScore = 63.25
-- 100000000 votes of 3 -> popularityScore = 0

可以计算上个月的相同分数并将其添加到此值中。

09-17 11:40