如何按ID消除列内重复数据(非整行重复)并优化多类型列整理?
需求:同一ID下列内去重的数据合并
核心要求
- 实现同一ID分组下,各列独立去重(仅消除列内重复值,而非整行重复)
- 不同类型字段(如Type1、Type2)之间无关联,无需保证行内对应关系
- ID列支持多字段组合(例如客户ID、客户编码、客户名称共同作为ID),类型字段也支持多组(例如联系人姓名、联系人电话为一组类型字段)
示例演示
原始数据表
| N | X | Y |
|---|---|---|
| 1 | A | XX |
| 1 | A | ZZ |
| 1 | B | YY |
| 1 | B | ZZ |
| 1 | A | XX |
| 2 | A | XX |
期望结果表
| N | X | Y |
|---|---|---|
| 1 | A | XX |
| 1 | B | ZZ |
| 1 | YY | |
| 2 | A | XX |
现有实现方案(仅支持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 | 客户编码 | 客户名称 | 联系人姓名 | 联系人电话 | 详情备注 |
|---|---|---|---|---|---|
| C001 | REF001 | 甲公司 | 张三 | 13xxxxxxx1 | 备注1 |
| C001 | REF001 | 甲公司 | 李四 | 13xxxxxxx2 | 备注2 |
| C001 | REF001 | 甲公司 | 备注3 | ||
| C002 | REF002 | 乙公司 | 王五 | 13xxxxxxx3 |
内容的提问来源于stack exchange,提问作者Glen
相关产品推荐
相关产品推荐

