你提到要在SQL查询中完成这个操作,所以下面我将给出SQL示例。
如果您有一个名为Pages
的表/视图,类似于下面这样:
Pages
-----
page_id:int
views:int - indexed
comments:int - indexed
然后你可以通过编写以下代码来对它们进行排序
SELECT * FROM Pages
ORDER BY
(0.3+LOG10(10+views)/LOG10(10+(SELECT MAX(views) FROM Pages))) +
(0.7+LOG10(10+comments)/LOG10(10+(SELECT MAX(comments) FROM Pages)))
我有意选择了不同的权重来衡量浏览量和评论。如果在浏览/评论方面保持相等的权重可能会出现一个问题,即排名成为自我实现的预言——一个页面排名靠前,因此被访问得更频繁,从而获得更多的分数,所以它会显示在列表的顶部,再次被访问更频繁,并获得更多的分数……赋予评论更多的权重反映了这些评论需要真正的努力和展示了真正的兴趣。
上述公式将根据历史统计数据给出排名。因此,在最近一周内积累与另一篇文章相同数量的浏览量/评论的文章将被赋予相同的优先级。重复公式可能是有意义的,每次指定一个日期范围,并偏爱活动更高的页面,例如:
0.3*(score for views/comments today) - live data
0.3*(score for views/comments in the last week)
0.25*(score for views/comments in the last month)
0.15*(score for all views/comments, all time)
这将确保“热门”页面比最近没有太多活动的类似得分页面具有更高的优先级。除了今天的得分以外,所有值都可以由定期存储过程在表中持久化,这样数据库就不必聚合许多评论/查看统计数据。仅当天的统计数据是“实时”计算的。进一步地,排名公式本身可以通过每日运行的存储过程计算和存储历史数据。
编辑:要获得严格范围从0.1到1.0,您应该像这样修改公式。但我强调一点-这只会增加开销并且是不必要的-优先级的绝对值并不重要-只有它们相对于其他网址的相对值重要。搜索引擎使用它们来回答问题,即URL A是否比URL B更重要/相关?它通过比较它们的优先级-哪一个最大-而不是它们的绝对值来做到这一点。
// 未归一化-x是某个页面ID
un(x) = 0.3 * log(views(x)+10) / log(10+maxViews()) +
0.7 * log(comments(x)+10) / log(10+maxComments())
// 原公式(现在为伪代码)
最大值将为1.0,最小值将从1.0开始向下移动,随着更多的查看/评论被进行。
我们将un(0)定义为最小值,即(在上述公式中,views(x)和comments(x)都为0)
要获得从0.1到1.0的归一化公式,然后计算n(x),页面x的归一化优先级。
(1.0-un(x)) * (un(0)-0.1)
n(x) = un(x) - ------------------------- when un(0) != 1.0
1.0-un(0)
= 0.1 otherwise.
m
,然后您可以为每个页面将其浏览量(或评论)除以m
。这将产生一个介于0和1之间的数字,并且“最重要”的(即最多浏览量或评论)网站将具有优先级1。 - phimuemue1.0、0.9、0.8、0.7、0.6、0.5、0.4、0.3、0.2、0.1、0.0
。问题是我需要在SQL查询中完成这个任务,而且行甚至没有按照这个值排序。 - stacker