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

Oracle查询:如何获取接收者唯一的最新记录

Oracle查询:筛选每个receiver对应的最新(id最大)记录

原始表结构与数据

idsenderreceiver
1AA
2AB
3AC
4BD
5DB
6BD

需求说明

筛选出每个receiver对应的最新记录(同一receiver保留id最大的条目),期望结果如下:

idsenderreceiver
1AA
3AC
5DB
6BD

方法1:使用ROW_NUMBER()窗口函数

这是Oracle处理分组取TopN场景的常用方案,逻辑清晰且性能优异:

SELECT id, sender, receiver
FROM (
    SELECT 
        id, 
        sender, 
        receiver,
        ROW_NUMBER() OVER (PARTITION BY receiver ORDER BY id DESC) AS rn
    FROM your_table_name
) t
WHERE rn = 1;
  • PARTITION BY receiver:按receiver字段分组
  • ORDER BY id DESC:每个分组内按id降序排列,最大的id会排在分组第一位
  • rn = 1:筛选出每个分组的第一条记录,即目标的最新条目

方法2:使用关联子查询

先通过子查询统计每个receiver的最大id,再关联原表获取完整记录:

SELECT t.id, t.sender, t.receiver
FROM your_table_name t
INNER JOIN (
    SELECT receiver, MAX(id) AS max_id
    FROM your_table_name
    GROUP BY receiver
) m ON t.receiver = m.receiver AND t.id = m.max_id;
  • 子查询先计算每个receiver对应的最大id值
  • 通过receiver和id关联原表,匹配到对应完整记录

方法3:使用Oracle特有KEEP语法

利用Oracle的KEEP子句直接获取分组内最大值对应的记录:

SELECT 
    MAX(id) KEEP (DENSE_RANK LAST ORDER BY id) AS id,
    MAX(sender) KEEP (DENSE_RANK LAST ORDER BY id) AS sender,
    receiver
FROM your_table_name
GROUP BY receiver;
  • DENSE_RANK LAST ORDER BY id:指定取每个分组内id最大的层级
  • MAX(column) KEEP (...):获取该层级对应的列值,因每个分组仅一个最大id,用MIN替换MAX结果一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:15:57