You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django:获取指定用户某日期前的最新记录

获取指定用户截止日期前的最新记录方案

针对你提到的UserData表需求,要获取每个指定用户在start_date之前的最新一条记录,可通过以下几种方式实现:

方式一:使用Django的annotate与Subquery(推荐)

利用子查询定位每个用户的最新date_created,再关联主表筛选对应记录:

from django.db.models import Subquery, OuterRef

# 子查询:获取每个用户在start_date前的最大date_created
latest_dates = UserData.objects.filter(
    user_id=OuterRef('user_id'),
    date_created__lte=start_date
).values('user_id').annotate(
    latest_date=models.Max('date_created')
).values('latest_date')

# 主查询:筛选出匹配的记录
result = UserData.objects.filter(
    user_id__in=user_list,
    date_created__lte=start_date,
    date_created=Subquery(latest_dates)
)

方式二:使用distinct与order_by

如果你的数据库支持distinct(fields)(如PostgreSQL),可直接通过排序后去重:

result = UserData.objects.filter(
    user_id__in=user_list,
    date_created__lte=start_date
).order_by('user_id', '-date_created').distinct('user_id')

注意:该方式仅适用于支持按指定字段去重的数据库,MySQL不支持distinct(fields)语法。

方式三:原生SQL查询

若需要更高灵活性,可编写原生SQL实现:

result = UserData.objects.raw('''
    SELECT u1.*
    FROM user_data u1
    INNER JOIN (
        SELECT user_id, MAX(date_created) AS latest_date
        FROM user_data
        WHERE user_id IN %s AND date_created <= %s
        GROUP BY user_id
    ) u2 ON u1.user_id = u2.user_id AND u1.date_created = u2.latest_date
''', [tuple(user_list), start_date])

你可根据项目使用的数据库类型和实际需求,选择合适的方案。

内容的提问来源于stack exchange,提问作者Piyush Divyankar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:18:21