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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:10:43