Не получать никаких выходных данных, когда предложение NOT используется в SQL для обнаружения дублирующихся записей при тех же значениях - PullRequest
4 голосов
/ 30 января 2020

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

Мой код:

WITH LOC_CTE AS
(SELECT DISTINCT fa.AccountKey, dce.EmailAddress , dcp.Phone , dpo.BrandName, dpo.BrandId
FROM Fact.Account fa
LEFT JOIN Dim.PetOwner dpo ON dpo.PetOwnerKey = fa.PetOwnerKey
LEFT JOIN Dim.RatingAddress dra ON dra.RatingAddressKey = fa.RatingAddressKey
LEFT JOIN Dim.CustomerEmail dce ON dce.CustomerEmailKey = fa.CurrentCustomerEmailKey
LEFT JOIN Dim.CustomerPrimaryPhone dcp ON dcp.CustomerPrimaryPhoneKey = fa.CurrentCustomerPrimaryPhoneKey
)


SELECT * FROM (
SELECT  LOC_CTE.*
   ,row_number() over (partition by EmailAddress,Phone,BrandId order by BrandName) as seqnum
      from LOC_CTE
           ) Q
where seqnum >= 1;

Вывод дает мне :

AccountKeyEmailAddress  Phone     BrandName BrandId seqnum
389082  0160150@m**.edu   2098579**    AP       4   1
430223  01co***st**e@msn.com8655677**9  AP      4   1
430224  01cor**s**e@msn.com 8655677**9  AP      4   2
531443  01mar**01@gmail.com 73278**63   AP      4   1
544454  01mu**rmyra@gmail.com 8133**793 AP      4   1
548374  03b**y13@gmail.com  30130**93   AP      4   1
216594  03d**ado@gmail.com  50363**34   AP      4   1
377919  03d**ado@gmail.com  50363**734  AP      4   2
486237  03d**ado@gmail.com  50363**734  HP      3   3
532010  041**hen@gmail.com  85749**455  AP      4   1
365925  05bla**ro*e21@gmail.com 682365**51  AP  4   1
365926  05bla**ro*e21@gmail.com 682365**51  HP  3   2

Так что, как можно заметить в моем выводе, я могу обнаружить дублирующиеся записи и последовательность их двойственности. Но я хочу, чтобы в моем окончательном отчете также было указано, повторяется ли один и тот же человек (адрес электронной почты и номер телефона) под другим брендом. Например, если вы заметили в последних двух строках выхода, это один и тот же человек, но под двумя разными брендами и идентификатором бренда. Но я просто хочу изолировать эти экземпляры и сгенерировать вывод, который показывает только оригинальный дубликат вместе с дубликатом, который подходит под другим брендом / brandID. Как мне это сделать?

Я пытался отредактировать последнюю строку моего предложения и интегрировал предложение NOT, но я не получил ни вывода, ни ошибок. Мой синтаксис может быть неправильным, но надеюсь, что это поможет с логикой c

where seqnum >= 1 AND NOT BrandID = BrandID ;

1 Ответ

1 голос
/ 30 января 2020

Вот один из методов:

select *
from (select LOC_CTE.*,
             row_number() over (partition by EmailAddress,Phone,BrandId order by BrandName) as seqnum,
             min(brandid) over (partition by EmailAddress, Phone) as min_brandid,
             max(brandid) over (partition by EmailAddress, Phone) as max_brandid
      from LOC_CTE
           ) Q
where seqnum >= 1 and  -- this condition is useless
      min_brandid <> max_brandid;
...