从历史数据中查询当前数据

时间:2018-09-20 19:52:11

标签: postgresql python-3.5 peewee

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

每隔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

1 个答案:

答案 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            |

Demo on DB Fiddle

  

如果reddit_id = 9hdajv有多个具有相同记录的记录该怎么办   acquisition_time = 1537471220是否还需要显示它们? – Raymond Nijland

     

不,如果可以,请选择其中之一。那不应该   发生在我的收藏代码中,如果确实如此,那对我来说并不重要   选择了哪一个– jarcobi889

它也可以按要求处理领带。

Demo on DB Fiddle