当前位置: 首页 > 面试题库 >

在SQL中实现Hacker News排名算法

杨轶
2023-03-14
问题内容

这是Paul Graham如何描述Hacker
News的排名算法

新闻.YC的只是

(p-1)/(t + 2)^ 1.5

其中p =点,t =年龄(小时)

鉴于下表,我想在纯mySQL中执行此操作:

  • 具有字段postID(索引)和postTime(时间戳)的表发布。
  • 带有字段表决ID(索引),帖子ID和表决(整数,0或1)的表投票。

投票域的想法是可以取消投票。出于排名目的,vote = 0等于完全没有投票。(所有投票均为赞成,无表决权。)

问题是如何构建返回前N个postID(按Paul
Graham公式排序)的查询。总共大约有10万个帖子,因此,如果您认为对成绩进行缓存或需要其他任何内容,我很乐意听取有关此方面的建议。

(显然,这不是火箭科学,我当然可以弄清楚,但是我发现吃SQL早餐,午餐和晚餐的人可能会觉得不高兴。而且在StackOverflow上使用它似乎很有价值。)

相关问题:

  • Linq-To-SQL中的Hacker News样式排序算法
  • 如何像黑客新闻一样分类
  • https://meta.stackexchange.com/questions/11602/what-formula-should-be-used-to-determine-hot

问题答案:

未经测试:

  SELECT x.*
    FROM POSTS x
    JOIN (SELECT p.postid, 
                 SUM(v.vote) AS points
            FROM POSTS p
            JOIN VOTES v ON v.postid = p.postid
        GROUP BY p.postid) y ON y.postid = x.postid
ORDER BY (y.points - 1)/POW(((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(x.timestamp))/3600)+2, 1.5) DESC
   LIMIT n


 类似资料:
  • 问题内容: 为什么此查询不起作用? 在此示例中,我尝试在其他计算中使用my_num别名。这导致未知列“ my_num” 这是我正在尝试做的简化版本,但是基本上我想使用别名进行其他计算。我的计算要复杂得多,这就是为什么给它加上别名的原因,因为我以不同的方式重复了几次。 问题答案: 只需将您的重用别名包装为:

  • 本文向大家介绍PHP实现排序堆排序(Heap Sort)算法,包括了PHP实现排序堆排序(Heap Sort)算法的使用技巧和注意事项,需要的朋友参考一下 算法引进: 在这里我直接引用《大话数据结构》里面的开头: 在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n - 1 次,本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则如何知道他是最小的记录。

  • 本文向大家介绍js实现常用排序算法,包括了js实现常用排序算法的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了js实现常用排序算法,具体内容如下 1.冒泡排序 2.选择排序  3.插入排序 4.希尔排序 5.归并排序 6.快速排序 总结:算法效率比较: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍java实现折半排序算法,包括了java实现折半排序算法的使用技巧和注意事项,需要的朋友参考一下 折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。 折半排序算法示意图: 以

  • 本文向大家介绍java实现快速排序算法,包括了java实现快速排序算法的使用技巧和注意事项,需要的朋友参考一下 1、算法概念。 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。 2、算法思想。 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序

  • 本文向大家介绍java实现归并排序算法,包括了java实现归并排序算法的使用技巧和注意事项,需要的朋友参考一下 归并排序算法思想: 分而治之(divide - conquer);每个递归过程涉及三个步骤 第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素. 第二, 治理: 对每个子序列分别调用归并排序MergeSort, 进行递归操作 第三, 合并: 合