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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:05:59