sql - 使用按日期范围分组的 Django 聚合以降低分辨率

标签 sql django average aggregation date-range

可怕的标题,但让我解释一下:我有这个包含时间戳(日期)和日志属性的 django 模型 - f.e.消耗一些资源的用户数量 - (值)。

class Viewers(models.Model):
    date = models.DateTimeField()
    value = models.IntegerField()

每 10 秒,该表包含用户数。像这样:
| date | value |
|------|-------|
|  t1  |   15  |
|  t2  |   18  |
|  t3  |   27  |
|  t4  |   25  |
|  ..  |   ..  |
|  t30 |   38  |
|  t31 |   36  |
|  ..  |   ..  |

现在我想从这些数据中生成不同的统计数据,每个统计数据都有不同的分辨率。例如对于最后一天的图表,我不需要 10 秒的分辨率,所以我想要 5 分钟的步骤(这是通过对从 t1 到 t29、t30 到 t59 的行的值(也可能是日期)求平均值来构建的。 ..),所以我会得到:
| date | value |
|------|-------|
|  t15 |   21  |
|  t45 |   32  |
|  ..  |   ..  |

保持变量的属性是开始和结束时间戳以及分辨率(如 5 分钟)。有没有办法使用 django orm/queryset api,如果没有,如何使用自定义 sql 来实现?

最佳答案

我一直试图以最“django”的方式解决这个问题。我已经解决了以下问题。它对 start_date 和 end_date 之间的 15 分钟时间段的值求平均值,其中列名为“date”:

readings = Reading.objects.filter(date__range=(start_date, end_date)) \
   .extra(select={'date_slice': "FLOOR (EXTRACT (EPOCH FROM date) / '900' )"}) \
   .values('date_slice') \
   .annotate(value_avg=Avg('value'))

它返回一个字典:
 {'value_avg': 1116.4925373134329, 'date_slice': 1546512.0}
 {'value_avg': 1001.2028985507246, 'date_slice': 1546513.0}
 {'value_avg': 1180.6285714285714, 'date_slice': 1546514.0}

核心思想来源于此answer对 PHP/SQL 的相同问题。传递给 extra 的代码用于 Postgres DB。

关于sql - 使用按日期范围分组的 Django 聚合以降低分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6266397/

相关文章:

mysql - 如何计算一个表中不同行和列之间的timestampdiff?

sql - 以函数为值执行\设置命令

SQL Server 显示不同列数大于 1 的结果

python - 计算列表中数字的平均值

c - 使用 C 从传感器获得的值中获取平均值

MySQL:过滤组 View 与内联选择

django - 在 Django 中,如何在进行任何验证之前计算或更新某些模型字段?

python - 将 Django 应用程序部署到 Heroku 时出现收集静态错误

python - 使用MongoDB作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

average - 每个产品的 Power BI 平均评分