SQL查询:如何获取每个parent_id对应的完整最新数据库条目?
解决方法
原查询的问题在于:按parent_id分组后,id和amount未使用聚合函数,数据库会返回分组内任意一条记录的对应值,而非与max(created_at)匹配的那条记录的数值,所以结果不符合预期。以下是几种可行的实现方式:
方案1:窗口函数(推荐,适用于MySQL 8+、PostgreSQL、SQL Server等支持窗口函数的数据库)
利用ROW_NUMBER()窗口函数对每组数据按创建时间倒序编号,取每组的第一条(最新记录):
SELECT id, parent_id, amount, created_at FROM ( SELECT id, parent_id, amount, created_at, ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY created_at DESC) AS rn FROM your_table_name ) t WHERE rn = 1;
PARTITION BY parent_id:按parent_id将数据分组ORDER BY created_at DESC:每组内按创建时间倒序排列,最新记录排在最前ROW_NUMBER():为每组内的记录编号,rn=1即取每组的最新记录
方案2:关联子查询(兼容低版本数据库)
先查询每个parent_id对应的最新创建时间,再关联原表获取对应记录的完整数据:
SELECT t.id, t.parent_id, t.amount, t.created_at FROM your_table_name t INNER JOIN ( SELECT parent_id, MAX(created_at) AS max_created FROM your_table_name GROUP BY parent_id ) tm ON t.parent_id = tm.parent_id AND t.created_at = tm.max_created;
注意:若同一parent_id下存在多条创建时间相同且均为最大值的记录,该查询会返回所有符合条件的记录。若需仅返回一条,可添加额外筛选条件(例如取最大id)。
方案3:自连接写法
通过自连接筛选出每个parent_id下没有更晚创建时间的记录:
SELECT t.id, t.parent_id, t.amount, t.created_at FROM your_table_name t LEFT JOIN your_table_name t2 ON t.parent_id = t2.parent_id AND t.created_at < t2.created_at WHERE t2.id IS NULL;
解释:左连接后,若找不到同parent_id下创建时间更晚的记录,t2.id会为NULL,此时当前记录即为该组的最新记录。同样,若存在多条同时间的最新记录,会返回所有符合条件的记录,可按需调整。
请将上述代码中的your_table_name替换为你的实际表名。
内容的提问来源于stack exchange,提问作者party
相关产品推荐
相关产品推荐

