2

我有以下 MySQL 查询,显示每 10 分钟间隔的平均值:

SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(date_time) / 600) * 600) AS interval_date_time,
AVG(some_value) AS avg_value
FROM djangoapp_somemodel
GROUP BY interval_date_time
ORDER BY interval_date_time;

例如,如果我有以下 3 条记录:

item_id 约会时间 一些值
1 2021-11-29 00:11:01 10
2 2021-11-29 00:16:15 20
3 2021-11-29 00:24:32 25

查询将输出以下内容:

间隔日期时间 avg_value
2021-11-29 00:10:00 15
2021-11-29 00:20:00 25

我怀疑查询效率不高,但我想使用 Django QuerySet 获得相同的输出。

作为参考,我的 Django 模型如下所示:

class SomeModel(models.Model):
    item_id = models.AutoField(primary_key=True)
    some_value = models.FloatField()
    date_time = models.DateTimeField(auto_now=True)

这是我当前的查询集:

(SomeModel.objects
    .annotate(interval_date_time=F("date_time"))
    .values("interval_date_time")
    .annotate(avg_value=Avg("some_value"))
    .order_by("interval_date_time")
)

我相信我需要对第一个注释方法调用进行更改。任何帮助将不胜感激,因为我对 Django 很陌生。

4

1 回答 1

2

RawSQL如果您知道您将始终使用 MySQL,那么在这里使用可能是最简单的。

(
    SomeModel.objects.annotate(interval_date_time=RawSQL("FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(date_time) / 600) * 600)", ()))
    .values("interval_date_time")
    .annotate(avg_value=Avg("some_value"))
    .order_by("interval_date_time")
)
于 2021-11-30T08:17:07.903 回答