Как преобразовать агрегированные данные в уникальные записи, исключить дубликаты и определить предпочтительные записи внутри дубликатов? - PullRequest
0 голосов
/ 29 июня 2011

У меня есть таблица, полученная из нескольких разных таблиц, с несколькими похожими (почти дублированными) строками, и мне нужно преобразовать похожие строки в отдельные строки.Использование 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. Мне нужно выполнить простое предложение WHERE для FieldE. Выполнение GROUP BY может разрешить уникальные комбинации FiledA и FieldB (отношение 1), но как мне решить, какая из строк в пределахвыбирается группировка.

Желаемым результатом из таблицы выше будет 4-я строка:
abc123, 123abc, Longer, Longer, extra

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Хорошо, вот настройка (с использованием образцов колонок с элегантным именем):

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, чтобы увидеть значения, которые он выдал для всех строк.

0 голосов
/ 29 июня 2011

вы будете использовать комбинацию предложений GROUP BY и HAVING count(*) > 1.

...