我已经在这个个人项目上工作了一段时间了,我正在为这个问题绞尽脑汁。
每隔20分钟,我的cron就会从subreddit中的帖子中获取数据。数据包括upvote计数,upvote比率等详细信息。我在收集数据的时间中也有一列,以便可以找到每个提交的最新数据。
当前数据显示在该提交的网页上,并且该提交的历史数据在该页面上显示为图表,因此我需要这两个集合。
一些用于表结构的示例列:
reddit_id | retrieval_time | total_upvotes | upvote_ratio | num_comments
该表包含多个reddit_id,每个reddit_id在某个时间点(retrieval_time)具有各自的数据(总计_upvotes,upvote_ratio)。
我最初的反应是对所有reddit_ids进行查询,然后遍历该列表并为每个id运行查询,如下所示:
SELECT reddit_id FROM nstats;
然后遍历查询结果并为每个查询运行此查询:
SELECT * FROM nstats WHERE reddit_id='9hdajv' ORDER BY retrieval_time DESC;
但是,至少在我的测试中,此方法的运行速度很慢。我正在将Postgres与Peewee和Python结合使用来进行数据库访问。
我是否需要重组保存数据的方式?我是否在查询正确的方法,而只需要应对速度较慢的情况?单个查询应该如何获取每个提交的最新数据?
添加示例输出以进行澄清。这就是原始表的样子:多个reddit_id具有各自的数据。
reddit_id | retrieval_time | total_upvotes | upvote_ratio | num_comments
9hdajv | 1537471220 | 15 | .78 | 3
9hdajv | 1537298420 | 7 | .98 | 0
9hdajv | 1537384820 | 10 | .86 | 1
7klmnq | 1534706420 | 25 | .86 | 1
7klmnq | 1534965620 | 35 | .75 | 5
3poslo | 1535311220 | 16 | .75 | 3
3poslo | 1535397620 | 20 | .83 | 6
3poslo | 1535570420 | 37 | .85 | 9
这将是输出,每个1个reddit_id及其最新数据。
reddit_id | retrieval_time | total_upvotes | upvote_ratio | num_comments
9hdajv | 1537471220 | 15 | .78 | 3
7klmnq | 1534965620 | 35 | .75 | 5
3poslo | 1535570420 | 37 | .85 | 9
答案 0 :(得分:1)
此查询接近预期的输出。
查询
SELECT
Table1."reddit_id"
, Table1."retrieval_time"
, Table1."total_upvotes"
, Table1."upvote_ratio"
, Table1."num_comments"
FROM (
SELECT
Table1."reddit_id"
, Table1."retrieval_time"
, Table1."total_upvotes"
, Table1."upvote_ratio"
, Table1."num_comments"
, ROW_NUMBER() OVER (PARTITION BY Table1."reddit_id" ORDER BY Table1."retrieval_time" DESC) AS row_num
FROM
Table1
) AS Table1
WHERE
Table1.row_num = 1
如果添加
ORDER BY
Table1.num_comments ASC
输出将是相同的。如果您关心订单。
结果
| reddit_id | retrieval_time | total_upvotes | upvote_ratio | num_comments |
| --------- | -------------- | ------------- | ------------ | ------------ |
| 3poslo | 1535570420 | 37 | 0.85 | 9 |
| 7klmnq | 1534965620 | 35 | 0.75 | 5 |
| 9hdajv | 1537471220 | 15 | 0.78 | 3 |
如果reddit_id = 9hdajv有多个具有相同记录的记录该怎么办 acquisition_time = 1537471220是否还需要显示它们? – Raymond Nijland
不,如果可以,请选择其中之一。那不应该 发生在我的收藏代码中,如果确实如此,那对我来说并不重要 选择了哪一个– jarcobi889
它也可以按要求处理领带。