1

У меня есть отчет, который отображает список дубликатов учетных записей на основе наших бизнес-правил. Это работает, когда одна новая учетная запись сопоставляется с другими существующими учетными записями. Там, где у меня возникают проблемы, когда несколько новых учетных записей совпадают с одним и тем же существующим дубликатом. Вот пример того, как она выглядит сейчас, сгруппированных по NewID:Группа SSRS на основе двух столбцов

NewID MatchedID FirstName LastName AddDate  Address  PhoneNumber 
10  10   Holly  Johnson  4/18/2013 123 1St Rd. 123 456 7890 
10  2   Hollie  Johnson  1/1/1990  123 1St Rd. 123 456 7890 

11  11   Holley  Johnson  4/17/2013 123 1St Rd. 123-456-7890 
11  2   Hollie  Johnson  1/1/1990  123 First Rd. 123 456 7890 

50  50   William  Johnson  4/17/2013 999 2nd St. 222 222 2222 
50  3   Bill  Jonson  1/2/1990  999 Second St. 222-222-2222 

Счета, которые имеют матчи сами включены для сравнения.

Итак, есть ли способ группировать эти похожие учетные записи вместе без дубликатов? Это должно выглядеть так:

GroupID AcctID FirstName LastName AddDate  Address  PhoneNumber 
1  2  Hollie  Johnson  1/1/1990  123 First Rd. 123 456 7890 
1  10  Holly  Johnson  4/18/2013 123 1St Rd. 123 456 7890 
1  11  Holley  Johnson  4/17/2013 123 1St Rd. 123-456-7890 
2  50  William  Johnson  4/17/2013 999 2nd St. 222 222 2222 
2  3  Bill  Jonson  1/2/1990  999 Second St. 222-222-2222 

Мне все равно, если группировка выполняется в SQL или в SSRS. Ему нужно будет ссылаться на два столбца ID, поскольку имя, адрес и номер телефона могут отличаться. Мне также нужен новый GroupID, назначенный так, чтобы они могли быть сгруппированы в отчете.

+0

Я не совсем уверен, что вы просите здесь. Можете ли вы предоставить следующее: образец базовых данных, результаты, которые вы сейчас получаете с этим образцом, и результаты, которые вы хотели бы получить с этим образцом. –

+0

Расширенные примеры, как было предложено. – StevenWhite

+0

Как вы выбираете между 'New -> 10 Matched -> 2' и' New -> 11 Matched -> 2' выше? Вы просто выбираете тот, у которого самый низкий 'NewID'? Кроме того, вы только хотите избавиться от повторяющихся значений «MatchedId» или должны учитываться все дополнительные поля адреса> –

ответ

1

Вы можете использовать функции ранжирования для устранения строк:

with NoDuplicates as 
(
    select * 
    , rownum = row_number() over (partition by MatchedID order by NewID) 
    from Accounts 
) 
select NewID 
    , MatchedID 
    , Name 
    , AddDate 
    , Address 
    , phoneNumber 
from NoDuplicates where rownum = 1 

SQL Fiddle with demo.

Хотя нет никаких причин, вы не можете просто использовать GROUP BY предполагая информацию адреса всегда дублируется также:

select NewID = min(NewID) 
    , MatchedID 
    , Name 
    , AddDate 
    , Address 
    , phoneNumber 
from Accounts 
group by MatchedID 
    , Name 
    , AddDate 
    , Address 
    , phoneNumber 

SQL Fiddle with demo.

Оба эти объекта возвращают ожидаемый результат.

Редактировать после комментария:

Вы можете сгруппировать связанные строки с утверждением, как это:

with NoDuplicates as 
(
    select * 
    , rownum = row_number() over (partition by MatchedID order by NewID) 
    from Accounts 
    where NewID <> MatchedID 
) 
select groupID = MatchedID 
    , Acct = MatchedID 
    , FirstName 
    , AddDate 
    , Address 
    , phoneNumber 
from NoDuplicates where rownum = 1 
union all 
select groupID = coalesce(am.MatchedID, a.NewID) 
    , Acct = a.MatchedID 
    , a.FirstName 
    , a.AddDate 
    , a.Address 
    , a.phoneNumber 
from Accounts a 
    -- join to the corresponding matched account 
    left join Accounts am on a.MatchedID = am.NewID and am.NewID <> am.MatchedID 
where a.NewID = a.MatchedID 
order by groupID, Acct 

SQL Fiddle with demo.

Однако, по существу, это просто группы по MatchedID. Если вы хотите, пронумерованные группы, начиная с 1, вы можете добавить предложение DENSE_RANK к заявлению:

with NoDuplicates as 
(
    select * 
    , rownum = row_number() over (partition by MatchedID order by NewID) 
    from Accounts 
    where NewID <> MatchedID 
) 
, GroupedAcct as 
(
    select GroupID = MatchedID 
    , Acct = MatchedID 
    , FirstName 
    , AddDate 
    , Address 
    , phoneNumber 
    from NoDuplicates where rownum = 1 
    union all 
    select GroupID = coalesce(am.MatchedID, a.NewID) 
    , Acct = a.MatchedID 
    , a.FirstName 
    , a.AddDate 
    , a.Address 
    , a.phoneNumber 
    from Accounts a 
    -- join to the corresponding matched account 
    left join Accounts am on a.MatchedID = am.NewID and am.NewID <> am.MatchedID 
    where a.NewID = a.MatchedID 
) 
select GroupID = Dense_Rank() over (order by GroupID) 
    , Acct 
    , FirstName 
    , AddDate 
    , Address 
    , phoneNumber 
from GroupedAcct 
order by groupID, Acct 

SQL Fiddle with demo.

+0

Первый пример, кажется, работает отлично. Пример Fiddle тоже был приятным. Благодаря! – StevenWhite

+0

Адрес, номер телефона и т. Д. Меняются, поэтому я не мог просто сгруппировать по ним. – StevenWhite

+0

Имеет смысл. Круто, рад, что это помогло. –