示例
记录表
id value created_datetime
1 10 2022-01-18 10:00:00
2 11 2022-01-18 10:15:00
3 8 2022-01-18 15:15:00
4 25 2022-01-19 09:00:00
5 16 2022-01-19 12:00:00
6 9 2022-01-20 11:00:00
我想过滤此表“记录表”以获取每个日期的最新值。例如,有三个日期 2022-01-18、2022-01-19、2022-01-20,其中这些日期的最新值如下如下
Latest value of each dates are (Result that iam looking to get)
id value created_datetime
3 8 2022-01-18 15:15:00
5 16 2022-01-19 12:00:00
6 9 2022-01-20 11:00:00
那么如何过滤才能收到如上表所示的结果
可以分两步完成:
首先获取每天的最新日期时间,然后按该日期时间过滤记录。
max_daily_date_times = Record.objects.extra(select={'day': 'date( created_datetime )'}).values('day') \
.annotate(latest_datetime=Max('created_datetime'))
records = Record.objects.filter(
created_datetime__in=[entry["latest_datetime"] for entry in max_daily_date_times]).values("id", "value",
"created_datetime")
我做了类似的事情,受到@Josewails 答案的启发,似乎在我的用例中有效,但尚未经过战斗测试。
在我的例子中,ids_query 不会包含那么多项目,因为应用程序将在大约 8 个月内退役,所以我不关心它是一个奇怪的大数据集。
ids_query = model.objects.all().annotate(
day=TruncDay('created')
).values('day').annotate(
last_id=Max('id'),
)
statuses = model.objects.filter(
id__in=[x['last_id'] for x in ids_query]
).order_by(
'created'
)