我有一个表,派生自几个不同的表,有几个相似的(接近重复的)行,需要将类似的行解析为单行。使用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
关系是:
上表中的预期结果将是第4行:
abc123,123abc,更长,更长,更多
答案 0 :(得分:0)
您将使用GROUP BY
和HAVING 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子句以查看它为所有行显示的值。