从历史数据查询当前数据

Querying Current Data from Historical Data

我已经在这个个人项目上工作了一段时间,我正在为这个问题绞尽脑汁。

每隔 20 分钟,我的 cron 就会从 subreddit 的帖子中获取数据。数据包括赞成票数、赞成率等详细信息。我还有一列用于收集数据的时间,因此我可以找到每次提交的最新数据。

当前数据显示在该提交的网页上,而该提交的历史数据在该页面上显示为图表和图形,所以我需要两套。

table 结构的一些示例列:

reddit_id | retrieval_time | total_upvotes | upvote_ratio | num_comments

table 包含多个 reddit_ids,每个 reddit_ids 在某个时间点 (retrieval_time) 都有各自的数据 (total_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 一起用于数据库访问。

我是否需要调整我保存数据的方式?我查询的方式是否正确,我只需要处理速度慢的问题?为每次提交获取最新数据的单个查询应该是什么样的?

添加示例输出以进行说明。这就是原始 table 的样子:多个 reddit_ids 每个都有自己的数据。

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

此查询接近预期输出。

查询

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            |

Demo on DB Fiddle

What if reddit_id = 9hdajv has multiple records with the same retrieval_time = 1537471220 do they need to be also displayed? – Raymond Nijland

No, just choose one of them if that slips through. That shouldn't happen in my collection code, and if it does, it doesn't matter to me which one is selected – jarcobi889

它还处理请求的关系。

Demo on DB Fiddle