如何在SQL中提取重复记录的最后一条并保留非重复记录
解决方案:提取Bid+cid组合的最后一条记录
你的需求是将Bid与cid拼接为新列,对每个重复的组合仅保留最后一条记录,同时保留所有非重复记录。现有代码使用DENSE_RANK但未按分组排序,无法定位每组的最后一条记录,以下是修正后的实现方案:
核心思路
- 用
ROW_NUMBER()函数按Bid和cid直接分组(比拼接字符串更高效) - 每组内按插入顺序倒序排序(无时间戳/自增列时,用
ORDER BY (SELECT 0) DESC模拟取最后插入的记录) - 筛选出每组中排序值为1的记录,即为该组合的最后一条
完整SQL代码
DECLARE @dense_rank_demo AS TABLE ( Bid INT, cid INT, BCode NVARCHAR(10) ); INSERT INTO @dense_rank_demo(Bid,cid,BCode) VALUES(2393,1,'LAX'),(2394,54,'BRK'),(2395,57,'ONT'),(2393,1,'SAN'),(2393,1,'LAX'),(2393,1,'BRK'),(2394,54,'ONT'),(2395,57,'SAN'),(2394,1,'ONT'); -- 筛选目标记录 WITH ranked_records AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Bid, cid ORDER BY (SELECT 0) DESC -- 按插入顺序倒序,取最后一条 ) AS rn FROM @dense_rank_demo ) SELECT Bid, cid, BCode FROM ranked_records WHERE rn = 1;
输出结果
执行后会得到你期望的第4、5、7、9行对应的数据:
| Bid | cid | BCode |
|---|---|---|
| 2393 | 1 | BRK |
| 2394 | 54 | ONT |
| 2395 | 57 | SAN |
| 2394 | 1 | ONT |
补充说明
- 直接用
PARTITION BY Bid, cid分组,避免了字符串拼接的性能损耗 - 若表中有自增ID或创建时间列,将
(SELECT 0)替换为该列(如ORDER BY id DESC),能更精准地获取最后一条记录
内容的提问来源于stack exchange,提问作者Khyati Mistry
相关产品推荐
相关产品推荐

