我正在制作一款涉及人们下载和评级用户创建的地图的游戏。如果他们喜欢/不喜欢它,他们可以选择对地图进行upvote / downvote,并且可以在1-10的范围内对其进行评分。
在地图浏览器中,他们可以选择按最高评分对地图进行排序。这是使用Laplace smoothing完成的,因此它会将upvotes的数量以及排序中的评分总数计算在内,按(upvotes + 1)/(numRatings + 2)
排序。这很好。
现在,还有一个按首选难度排序的选项,人们可以从1-10中选择一个值,它会根据平均难度等级与首选等级的接近程度对地图进行排序。起初我按ABS(preferred_difficulty - average_difficulty)
排序,但这并没有考虑到评分的数量。现在我正在使用((numRatings + 1) * (10 - ABS(average_difficulty - preferred_difficulty)) + 1) / (numRatings + 1.5)
纯粹的试验和错误,这有点有效,但有时收视率超过首选难度,结果看起来很奇怪。
这是我需要帮助的 - 我无法弄清楚如何将首选和平均难度之间的最小差异排序,同时将评分数量合并到混音中,因为我想要一个具有高评级数的低难度delta是最好的结果,而不是具有高评级数的高upvote数,就像评级一样。
例如,如果这是数据:
AvgDifficulty NumRatings
6.0 1
4.0 25
6.8 4
6.2 3
6.5 20
6.2 1
6.4 3
有人选择6.4的首选难度,我希望它能这样排序:
AvgDifficulty NumRatings
6.5 20
6.4 3
6.2 3
6.8 4
6.2 1
6.0 1
4.0 25
基本上我希望得到的结果接近顶部的首选难度,但我宁愿显示结果是0.1关,其中有很多评分,而不是完全匹配的评分很少。我知道在这种情况下得到“正确”的结果可能不是很具体,我只是在寻找一个起点。
感谢您的帮助!
答案 0 :(得分:0)
你有一个模糊的问题。你需要一些方法来结合评级和计数。基本查询是:
order by abs(avg_difficulty - 6.4)
但是,你也希望包括计数。您可以在顶部定义固定的乐队,并按排名顺序排列:
order by (case when abs(avg_difficulty - 6.4) < 0.1) then numratings end) desc,
abs(avg_difficulty - 6.4)
此表达式将6.3 - 6.5中的所有内容组合在一个组中,并按评级数对其进行排序。第二个键按其他方式排序其他所有内容。