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

MySQL查询:如何获取同一test_id对应的最新测试运行结果?

我来帮你解决这个问题!你之前用自连接写的SQL只返回21行,原因很简单——它只筛选出了那些有至少两条运行记录的test_id里相对更新的条目,完全漏掉了只有单条记录的test_id(也就是剩下的66-21=45个)。下面给你两种靠谱的纯SQL解决方案,以及Python的实现方式:

纯SQL解决方案

方法1:使用窗口函数(推荐)

这是处理这类“分组取最新”场景最通用的方式,不管每个test_id有1条还是多条记录,都能精准拿到最新的那一条:

WITH ranked_test_results AS (
    SELECT 
        *,
        -- 按test_id分组,每个组内按started倒序编号,最新的记录编号为1
        ROW_NUMBER() OVER (PARTITION BY test_id ORDER BY started DESC) AS row_rank
    FROM test_results
)
-- 只保留每个组内编号为1的记录,也就是最新的那条
SELECT * EXCEPT(row_rank)
FROM ranked_test_results
WHERE row_rank = 1;

如果你的MySQL版本不支持EXCEPT(比如低于8.0),可以把要查询的字段列出来,跳过row_rank即可,比如:

WITH ranked_test_results AS (
    SELECT 
        test_id, started, [其他需要的字段],
        ROW_NUMBER() OVER (PARTITION BY test_id ORDER BY started DESC) AS row_rank
    FROM test_results
)
SELECT test_id, started, [其他需要的字段]
FROM ranked_test_results
WHERE row_rank = 1;

方法2:子查询关联最大时间

这种方法先找出每个test_id对应的最新运行时间,再关联原表获取完整记录:

SELECT t.*
FROM test_results t
INNER JOIN (
    -- 先获取每个test_id的最新started时间
    SELECT test_id, MAX(started) AS latest_start_time
    FROM test_results
    GROUP BY test_id
) AS latest_times 
ON t.test_id = latest_times.test_id AND t.started = latest_times.latest_start_time;

⚠️ 注意:如果同一个test_id存在两条完全相同时间的运行记录,这个方法会返回多条结果。如果要避免这种情况,建议用窗口函数的方法,或者在子查询里再加一个排序字段(比如记录的ID)来确保唯一性。

Python实现方式

如果用Python处理,可以借助pandas库快速完成分组取最新的操作,步骤如下:

import pandas as pd
import mysql.connector

# 1. 连接MySQL数据库(替换成你的数据库信息)
db_config = {
    'host': '你的主机地址',
    'user': '你的用户名',
    'password': '你的密码',
    'database': '你的数据库名'
}
conn = mysql.connector.connect(**db_config)

# 2. 读取test_results表的所有数据到DataFrame
df = pd.read_sql("SELECT * FROM test_results", conn)
conn.close()

# 3. 按started降序排序,然后按test_id分组取第一个(即最新的记录)
# 如果存在相同started的记录,可以加其他字段排序,比如按id降序:sort_values(['started', 'id'], ascending=[False, False])
latest_results = df.sort_values('started', ascending=False).groupby('test_id').first().reset_index()

# 4. 查看结果或保存回数据库
print(latest_results)
# 如果要保存到新表:
# conn = mysql.connector.connect(**db_config)
# latest_results.to_sql('latest_test_results', conn, if_exists='replace', index=False)
# conn.close()

这个方法的逻辑很直观:先把所有数据按时间倒序排好,再按test_id分组,每组只保留第一行(也就是最新的那条记录)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:13:50