如何查询表中每个unique_id对应的最新提交记录行?
解决方法:获取每个unique_id的最新提交记录
你的原SQL逻辑完全偏离需求——GROUP BY column1, column2, column3是按这三个字段分组,而非unique_id,再加上HAVING COUNT(*) > 1,直接过滤掉了所有仅含1条记录的unique_id,这肯定不符合要求。
以下是两种通用的正确写法:
方法1:使用窗口函数(推荐,适用于MySQL 8.0+、PostgreSQL、SQL Server等)
假设你的表中有一个标识提交时间的字段submit_time(如果是自增ID,比如record_id,逻辑一致,替换排序字段即可):
SELECT unique_id, column1, column2, column3 FROM ( SELECT t1.unique_id, t1.column1, t1.column2, t1.column3, -- 按unique_id分组,按提交时间倒序,最新记录排第1 ROW_NUMBER() OVER (PARTITION BY t1.unique_id ORDER BY t1.submit_time DESC) AS rn FROM table1 t1 INNER JOIN table2 t2 ON t1.X1 = t2.X2 ) AS sub_query WHERE rn = 1 ORDER BY column1;
核心逻辑:用PARTITION BY t1.unique_id把数据按unique_id分组,每组内按提交时间倒序排序,取排序后第一条(rn=1),就是该unique_id的最新记录,无论该组有1条还是多条数据。
方法2:关联子查询(兼容MySQL 5.x等不支持窗口函数的版本)
SELECT t1.unique_id, t1.column1, t1.column2, t1.column3 FROM table1 t1 INNER JOIN table2 t2 ON t1.X1 = t2.X2 WHERE NOT EXISTS ( SELECT 1 FROM table1 t1_dup WHERE t1_dup.unique_id = t1.unique_id -- 同样,用submit_time或自增ID判断记录新旧 AND t1_dup.submit_time > t1.submit_time ) ORDER BY column1;
核心逻辑:对每条记录,检查同unique_id下有没有比它更新的记录,如果没有,就说明这条是该unique_id的最新记录,会被保留。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

