在Django中获取每个Agent的最新签到记录
获取每个Agent的最新签到记录解决方案
针对你在Django+MySQL环境下,需要从AgentCheckin表中获取每个agent最新签到记录的需求,以下是几种可行的实现方式:
方法一:子查询匹配最大时间戳
先通过子查询筛选出每个agent对应的最新timestamp,再关联原表获取完整记录:
from django.db.models import Subquery, OuterRef # 子查询:获取每个agent的最新timestamp latest_timestamps = AgentCheckin.objects.filter( agent=OuterRef('agent') ).order_by('-timestamp').values('timestamp')[:1] # 获取每个agent的最新完整记录 latest_records = AgentCheckin.objects.filter( timestamp=Subquery(latest_timestamps) ).order_by('agent')
方法二:窗口函数筛选(Django 2.0+ 支持)
利用RowNumber窗口函数按agent分组,再按timestamp倒序排序,取每组第一条记录:
from django.db.models import Window, F from django.db.models.functions import RowNumber # 为每条记录添加分组内的行号,同一agent内按timestamp倒序排列 ranked_records = AgentCheckin.objects.annotate( row_num=Window( expression=RowNumber(), partition_by=F('agent'), order_by=F('timestamp').desc() ) ) # 筛选每组行号为1的记录(即最新签到记录) latest_records = ranked_records.filter(row_num=1).order_by('agent')
方法三:原生SQL查询
如果ORM方法性能达不到预期,可直接使用原生SQL:
latest_records = AgentCheckin.objects.raw(""" SELECT ac.* FROM agent_checkin ac INNER JOIN ( SELECT agent, MAX(timestamp) AS latest_time FROM agent_checkin GROUP BY agent ) ac_latest ON ac.agent = ac_latest.agent AND ac.timestamp = ac_latest.latest_time ORDER BY ac.agent """)
注意:若同一agent在同一时间戳下有多条记录,上述方法会返回所有符合条件的记录。若要确保每个agent仅返回一条,可结合id排序(比如取最大id)调整查询逻辑。
内容的提问来源于stack exchange,提问作者Marek
相关产品推荐
相关产品推荐

