我是 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
从我的输出中可以看出,我能够检测重复的记录及其重复的顺序。但我想要的是,我的最终报告还可以检测同一个人(电子邮件和电话号码)是否在不同品牌下重复出现。例如,如果您注意到输出的最后两行是同一个人,但属于 2 个不同的品牌和品牌 ID。但我只想隔离这些实例并生成一个输出,该输出仅显示原始副本以及不同品牌/brandID 下出现的副本。我该怎么做?
我尝试编辑子句的最后一行并集成 NOT 子句,但我没有收到任何输出,也没有收到任何错误。我的语法可能是错误的,但希望这有助于逻辑
where seqnum >= 1 AND NOT BrandID = BrandID ;
最佳答案
这是一种方法:
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;
关于mysql - 在 SQL 中使用 NOT 子句检测相同值下的重复记录时,没有收到任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59989077/