如何在django中过滤获取每个日期最新记录

问题描述 投票:0回答:2

示例

记录表

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

那么如何过滤才能收到如上表所示的结果

django django-models django-filter
2个回答
1
投票

可以分两步完成:

首先获取每天的最新日期时间,然后按该日期时间过滤记录。

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")

0
投票

我做了类似的事情,受到@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'
)
© www.soinside.com 2019 - 2024. All rights reserved.