如何将每个日期时间间隔 MySQL 查询的平均值重写为 Django QuerySet?
How can I rewrite an average value per date time interval MySQL query as a Django QuerySet?
我有以下 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
date_time
some_value
1
2021-11-29 00:11:01
10
2
2021-11-29 00:16:15
20
3
2021-11-29 00:24:32
25
查询将输出以下内容:
interval_date_time
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 还很陌生。
如果您知道您将始终使用 MySQL,那么在这里使用 RawSQL
可能是最简单的。
(
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")
)
我有以下 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 | date_time | some_value |
---|---|---|
1 | 2021-11-29 00:11:01 | 10 |
2 | 2021-11-29 00:16:15 | 20 |
3 | 2021-11-29 00:24:32 | 25 |
查询将输出以下内容:
interval_date_time | 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 还很陌生。
如果您知道您将始终使用 MySQL,那么在这里使用 RawSQL
可能是最简单的。
(
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")
)