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
相关产品推荐
相关产品推荐

