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

