Django按时间序列中的ID过滤和选择每个月的最后一条记录的方法?

Posted

技术标签:

【中文标题】Django按时间序列中的ID过滤和选择每个月的最后一条记录的方法?【英文标题】:Django way to filter and select the last record for each month by ids in a time series? 【发布时间】:2016-10-02 21:17:39 【问题描述】:

我有一个时间序列数据存储在 postgres 中。在给定视频 ID 的情况下,我想查看每个月最后记录的观看次数。

VideoID  |   created   |  views
  1        2015-01-01      5
  2        2015-01-01      5
  1        2015-01-15      20
  1        2015-01-28      30
  2        2015-02-01      40
  1        2015-02-01      50
  1        2015-02-26      60  
  1        2015-03-05      100

给定模型

from django.db import models

class Video(models.Model):
    id = models.IntegerField()

class VideosStats(models.Model):
    video_id = models.ForeignKey(Video)
    views = models.IntegerField()

我知道有类似的 SQL 问题,但我想知道在 django 中是否可以实现此效果。期望的输出:

视频 ID 1 ['created': 2015-01-28, 'views': 30, 'created': 2015-02-26, 'views': 60, 'created': 2015-03-05, 'views ': 100]

【问题讨论】:

到目前为止你尝试了什么? 如果您想要一个原始 sql 查询来发布表结构是正确的做法,但您要求的是 orm 查询,那么您不应该发布模型吗? 该表反映了模型@e4c5,发布该表可帮助您了解数据的结构。在我看来,这是一个更好的视觉效果。我没有尝试过任何事情,因为我认为这是不可能的。 也很好奇为什么这被否决了 如果您希望我们将您的表格转换为模型,您还有另一个想法。 【参考方案1】:

因此,给定一年,您可以在查询集上执行额外/提取过滤器,为您提供每个视频每个月的最新记录。

the_year = 2016 # the year you want
queryset = VideoStats.filter(created__year=the_year)
queryset = queryset.extra(select='month': "EXTRACT(month from created)").values('month').annotate(Max('views')).order_by('month')                   

【讨论】:

以上是关于Django按时间序列中的ID过滤和选择每个月的最后一条记录的方法?的主要内容,如果未能解决你的问题,请参考以下文章

按用户角色和 id 过滤的 Django 自定义权限

Django按用户组过滤外键关系

MS Access:按开始日期和结束日期之间每个月的月份分组

如何在 Django 模型中存储每个月的数据

Django admin 根据另一个字段值过滤一个外部字段

为每个 ID 选择每个月的最后一条记录