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

如何按ID消除列内重复数据(非整行重复)并优化多类型列整理?

需求:同一ID下列内去重的数据合并

核心要求

  • 实现同一ID分组下,各列独立去重(仅消除列内重复值,而非整行重复)
  • 不同类型字段(如Type1、Type2)之间无关联,无需保证行内对应关系
  • ID列支持多字段组合(例如客户ID、客户编码、客户名称共同作为ID),类型字段也支持多组(例如联系人姓名、联系人电话为一组类型字段)

示例演示

原始数据表

NXY
1AXX
1AZZ
1BYY
1BZZ
1AXX
2AXX

期望结果表

NXY
1AXX
1BZZ
1YY
2AXX

现有实现方案(仅支持2类类型列)

DECLARE @T TABLE (N INT, X CHAR(1), Y CHAR(2))

INSERT INTO @T
    SELECT t.N, t.X, t.Y
    FROM (VALUES(1, 'A', 'XX'),
                (1, 'A', 'ZZ'),
                (1, 'B', 'YY'),
                (1, 'B', 'ZZ'),
                (1, 'A', 'XX'),
                (2, 'A', 'XX')
                ) t(N,X,Y)

SELECT * FROM @T

SELECT
    ISNULL(k.N, l.N) AS N, k.X, l.Y
FROM 
    (SELECT 
         ROW_NUMBER() OVER (PARTITION BY a.N ORDER BY a.X) AS ID, 
         a.N, a.X
     FROM 
         (SELECT DISTINCT N, X
          FROM @T) a
    ) k
FULL JOIN 
    (SELECT 
         ROW_NUMBER() OVER (PARTITION BY b.N ORDER BY b.Y) AS ID, 
         b.N, b.Y
     FROM 
         (SELECT DISTINCT N, Y
          FROM @T) b
    ) l ON l.N = k.N and l.ID = k.ID

方案局限性

该方案通过对两类字段分别去重后加行号再全连接实现,但当类型字段增加到5种及以上时,需要多次嵌套全连接,逻辑会变得异常复杂,代码可读性和维护性极差。

问题咨询

是否存在更简便的通用实现方法?比如采用先Pivot再DISTINCT后Unpivot的思路是否可行?

真实业务场景补充

涉及表结构

  • Customers:存储客户基础信息,含层级关系字段(如父客户ID)
  • Contacts:存储联系人基础信息
  • ContactToType:关联联系人与客户,记录一个联系人对应的多个客户
  • Detail:存储客户/联系人的补充详情

业务规则

  • 单个联系人可关联多个不同客户
  • 客户存在上下级层级关系,需保留层级信息
  • 需按客户维度(多字段ID组合),对联系人姓名、联系人电话、详情备注等多类字段分别去重后合并展示

期望最终结果

客户ID客户编码客户名称联系人姓名联系人电话详情备注
C001REF001甲公司张三13xxxxxxx1备注1
C001REF001甲公司李四13xxxxxxx2备注2
C001REF001甲公司备注3
C002REF002乙公司王五13xxxxxxx3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:42:13