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

如何用T-SQL实现按OrderId去重并优先保留Code2记录

如何用T-SQL实现按OrderId保留指定优先顺序的记录?

原始数据表

OrderIdCodeVal
1Code1abc
2Code2def
3Code1aaa
3Code2bbb

期望结果

OrderIdCodeVal
1Code1abc
2Code2def
3Code2bbb

需求说明

每个OrderId仅保留一条记录;若同一OrderId存在多个Code值,优先保留Code2。

你尝试的代码

select OrderId, Code, count(*)
from Table1
group by OrderId, Code

解决方案

可以使用ROW_NUMBER()窗口函数实现需求,通过自定义排序规则给Code2更高的优先级,再筛选每个OrderId的第一条记录:

WITH RankedOrders AS (
    SELECT 
        OrderId,
        Code,
        Val,
        -- 按OrderId分组,Code2优先排在前面,生成行号
        ROW_NUMBER() OVER (
            PARTITION BY OrderId 
            ORDER BY CASE WHEN Code = 'Code2' THEN 1 ELSE 2 END
        ) AS RowNum
    FROM Table1
)
SELECT OrderId, Code, Val
FROM RankedOrders
WHERE RowNum = 1;

说明

  • PARTITION BY OrderId:将数据按OrderId分组,每组单独计算行号
  • ORDER BY CASE WHEN Code = 'Code2' THEN 1 ELSE 2 END:自定义排序规则,让Code2的记录行号为1,其他Code的行号为2
  • 最后筛选RowNum = 1的记录,即可得到每个OrderId的优先保留记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:25:34