我正在开发一个新网站,其中有一些“实体”可以投票。
每次投票都可以是1到5之间的数字,其中1是最差投票,5是最佳投票。
现在,在同一个网站上,我有一个“热门实体图表”,我根据他们的投票列出了最受欢迎的“实体”。
现在,我不能做一个简单的算术平均值,因为一票5的“实体”可能与100个5票的“实体”具有相同的排名。
我考虑过存储每个“实体”而不是算术平均值,而且还有投票数和执行SQL查询,我按照投票数和算术平均数进行排序但似乎在此之后,有多个投票的实体1可以流行(当它不受欢迎时)。
我可以使用什么算法?
答案 0 :(得分:1)
对于一个基本的解决方案,试试order by [average vote] desc, [vote count] desc
这两种具有相同平均值的实体,100票的票数将高于1票,但平均值为4.5的票将永远不会高于1票。平均为5.
修改1
如果你希望 100投票平均值4.5赢得10投票平均5,为什么不计票忽略1,2和3,或[票数4和5] - [计数]第1和第2票]?这样,正投票的数量会使实体在排名中上升。
修改2
您可能希望对最近的投票给予特别重视。关于改变用户意见的实体可能会有所改变。可以建立上个月的另一次平均投票,并根据它调整最终排名。
编辑3
如何计算[popularScore]列并按其排序?
-- 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
可以计算上个月的相同分数并将其添加到此值。