如何将聚合数据解析为唯一条目,消除重复项,同时识别重复项中的首选记录

时间:2011-06-28 23:41:06

标签: sql select distinct

我有一个表,派生自几个不同的表,有几个相似的(接近重复的)行,需要将类似的行解析为单行。使用DISTINCT或UNION以任意方式解析行。我想简单地说一行优先于另一行。例如:

Table: Foo  
FieldA, FieldB, FieldC, FieldD, FieldE  
abc123, 123abc, short, short, extra  
abc123, 123abc, Longer, short, extra  
abc123, 123abc, short, Longer, extra  
abc123, 123abc, Longer, Longer, extra  
abc123, 123abc, short, short, extra  

关系是:

  1. FieldA和FieldB形成唯一性(即,这两个字段的每个唯一集合为1行)
  2. FieldC和FieldD越长越好
  3. 我需要在FieldE上执行一个简单的WHERE子句 执行GROUP BY可以解析为唯一的FiledA& FieldB组合(关系1),但如何解析分组中的哪些行被选中。
  4. 上表中的预期结果将是第4行:
    abc123,123abc,更长,更长,更多

2 个答案:

答案 0 :(得分:0)

您将使用GROUP BYHAVING count(*) > 1条款的组合。

答案 1 :(得分:0)

好的,这是设置(使用优雅命名的样本列):

CREATE TABLE dbo.Foo
    (
    FieldA varchar(50) NOT NULL,
    FieldB varchar(50) NOT NULL,
    FieldC varchar(50) NOT NULL,
    FieldD varchar(50) NOT NULL,
    FieldE varchar(50) NOT NULL
    )  
go

insert into foo values('abc123', '123abc', '01', '01', '')
insert into foo values('abc123', '123abc', '012', '012', '')
insert into foo values('abc123', '123abc', '0123', '01', '')
insert into foo values('abc123', '123abc', '01234567', '01', '')
insert into foo values('abc123', '123abc', '012345', '012345', '')
insert into foo values('def123', '123def', '012345', '012345', '')
insert into foo values('def123', '123def', '', '012345', '')

解决方案:

select * from
(
select *, row_number() over(partition by fielda, fieldb order by len(fieldc) + len(fieldd) desc) seq
from foo
) ordered
where seq = 1

这将为您提供前两列的唯一组合,以及最长的(定义为col3的长度+ col4的长度)

拉出where子句以查看它为所有行显示的值。