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

如何在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行对应的数据:

BidcidBCode
23931BRK
239454ONT
239557SAN
23941ONT

补充说明

  • 直接用PARTITION BY Bid, cid分组,避免了字符串拼接的性能损耗
  • 若表中有自增ID或创建时间列,将(SELECT 0)替换为该列(如ORDER BY id DESC),能更精准地获取最后一条记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:45:54