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

如何检索所有非最新记录行:排除各名称最新条目,单条记录名称不纳入

如何检索每个分组的非最新记录行(排除最新条目)

要实现按名称分组,仅保留每组中除最新记录外的所有条目(单条记录的分组直接排除),可以用以下两种高效的SQL方案:

方案1:窗口函数(推荐,逻辑直观)

利用ROW_NUMBER()窗口函数对每个名称分组内的记录按日期倒序编号,最新记录的编号为1,筛选编号大于1的记录即可:

SELECT name, date, picture
FROM (
    SELECT 
        name, 
        date, 
        picture,
        -- 按name分组,每组内按date降序排序,最新的记录排第1
        ROW_NUMBER() OVER (PARTITION BY name ORDER BY date DESC) AS record_rank
    FROM your_table_name -- 替换为你的实际表名
) ranked_records
WHERE record_rank > 1;

逻辑说明:

  • PARTITION BY name:将数据按名称分组
  • ORDER BY date DESC:每组内按日期从新到旧排序
  • 外层筛选record_rank > 1:直接排除每组的最新记录,同时自动过滤掉只有单条记录的分组(这类分组的唯一记录rank为1,不会被选中)

方案2:子查询关联(兼容旧版数据库)

先通过子查询获取每个名称的最新日期,再关联原表筛选出日期小于最新日期的记录:

SELECT r.name, r.date, r.picture
FROM your_table_name r
INNER JOIN (
    -- 找出每个name的最新日期
    SELECT name, MAX(date) AS latest_date
    FROM your_table_name
    GROUP BY name
) latest ON r.name = latest.name
WHERE r.date < latest.latest_date;

逻辑说明:

  • 子查询latest得到每个名称的最新日期
  • 关联原表后,筛选r.date < latest.latest_date,仅保留每组中早于最新日期的记录,单条记录的分组因无符合条件的行被自动排除

验证示例数据

针对你提供的示例表,两种方案都会返回预期结果:

  • 排除仅1条记录的jose
  • 保留ned除2021-12-19外的2条记录
  • 保留sid除2017-12-20外的1条记录
  • 保留wade除2022-12-05外的3条记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:31:14