Oracle查询:如何获取接收者唯一的最新记录
Oracle查询:筛选每个receiver对应的最新(id最大)记录
原始表结构与数据
| id | sender | receiver |
|---|---|---|
| 1 | A | A |
| 2 | A | B |
| 3 | A | C |
| 4 | B | D |
| 5 | D | B |
| 6 | B | D |
需求说明
筛选出每个receiver对应的最新记录(同一receiver保留id最大的条目),期望结果如下:
| id | sender | receiver |
|---|---|---|
| 1 | A | A |
| 3 | A | C |
| 5 | D | B |
| 6 | B | D |
方法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
相关产品推荐
相关产品推荐

