查询 Select 一条 "More Complete" 重复记录
Query to Select a "More Complete" Duplicate Record
我正在尝试编写一个 SQL 查询,它将 select 一个 "more complete" 重复。例如,如果我们的 table 包含以下 4 个字段:Name、Phone、Email、CompanyId,对于两条记录,Name 和 CompanyId 都相等,但其中一个包含 Phone and/or Email 和 other record 将这两个字段留空,那么记录集中只有完成的记录可用。
我以为我已经完成了查询,但如果 "more complete" 记录不存在,那么该记录要么被完全遗漏,要么在记录集中保持重复(取决于我修改查询的方式)。我不确定是否有更好的方法不会导致任何数据 loss/duplication。现在我能想到的就是 UNION
一堆其他查询,但我觉得必须有更好的方法。我正在使用 CTE 获取原始数据,然后这是我试图通过操作它来删除重复项的操作:
;WITH Contacts AS (
-- LONG QUERY HERE THAT UNIONS NECESSARY Tables & XML Columns AND returns a recordset with Name, Email, Phone, and ClientId
)
SELECT u.* FROM Contacts u
INNER JOIN (
SELECT Name, ClientId, Count(*) AS ct FROM Contacts
GROUP BY Name, ClientId
HAVING COUNT(*) > 1
) AS g
ON u.Name = g.Name AND u.ClientId = g.ClientId
WHERE Phone IS NOT NULL AND Email IS NOT NULL
UNION
SELECT u.* FROM Contacts u
INNER JOIN (
SELECT Name, ClientId, Count(*) AS ct FROM Contacts
GROUP BY Name, ClientId
HAVING COUNT(*) = 1
) AS h
ON u.Name = h.Name AND u.ClientId = h.ClientId
如果需要联合更多的查询,那没什么大不了的,但似乎可能有更好的方法来处理这个问题。有什么建议吗?
编辑:示例数据
Name | Phone | Email | ClientId
------------------------------------------------------
Person1 | NULL | NULL | 42
Person1 | 555-555-5555 | test@blah.org | 42
Person2 | NULL | NULL | 21
Person2 | NULL | NULL | 21
Person3 | 555-555-5555 | NULL | 79
Person3 | NULL | NULL | 79
Person4 | 555-555-5555 | NULL | 49
Person4 | NULL | test@blah.org | 49
Person5 | 555-555-5555 | NULL | 91
Person5 | 555-555-5555 | test@blah.org | 91
Person6 | 555-555-5555 | NULL | 91
查询后返回数据集--
Name | Phone | Email | ClientId
------------------------------------------------------
Person1 | 555-555-5555 | test@blah.org | 42
Person2 | NULL | NULL | 21
Person3 | 555-555-5555 | NULL | 79
Person4 | 555-555-5555 | test@blah.org | 49
Person5 | 555-555-5555 | test@blah.org | 91
Person6 | 555-555-5555 | NULL | 91
Person4 的数据合并是理想情况,但不一定是我在这个 SO 问题中寻找的答案。在填写姓名或电子邮件的情况下,只要没有任何数据丢失,我就可以重复使用。
试试这个
WITH CT AS(
SELECT Name, Phone, Email, CompanyId,
--This part determines duplicates by field
RN = ROW_NUMBER()OVER(PARTITION BY Name,CompanyId ORDER BY Name)
FROM Contacts
)
select FROM CT WHERE email <> '' and phone <> ''
要select 根据特定列重复
ROW_NUMBER()OVER(PARTITION BY {column1}, {column2}.....
这将 return 每个 name
的 "best" 行。最佳意味着额外列的最大数量(Mail
、Phone
)不为空。
select top(1) with ties *
from Contact
order by row_number() over (partition by Name order by
case when Phone is null then 0 else 1 end + case when Email is null then 0 else 1 end desc)
这肯定有效..
select
name,max(phone),max(email),clientid
from
Table t
group by name,clientid
我正在尝试编写一个 SQL 查询,它将 select 一个 "more complete" 重复。例如,如果我们的 table 包含以下 4 个字段:Name、Phone、Email、CompanyId,对于两条记录,Name 和 CompanyId 都相等,但其中一个包含 Phone and/or Email 和 other record 将这两个字段留空,那么记录集中只有完成的记录可用。
我以为我已经完成了查询,但如果 "more complete" 记录不存在,那么该记录要么被完全遗漏,要么在记录集中保持重复(取决于我修改查询的方式)。我不确定是否有更好的方法不会导致任何数据 loss/duplication。现在我能想到的就是 UNION
一堆其他查询,但我觉得必须有更好的方法。我正在使用 CTE 获取原始数据,然后这是我试图通过操作它来删除重复项的操作:
;WITH Contacts AS (
-- LONG QUERY HERE THAT UNIONS NECESSARY Tables & XML Columns AND returns a recordset with Name, Email, Phone, and ClientId
)
SELECT u.* FROM Contacts u
INNER JOIN (
SELECT Name, ClientId, Count(*) AS ct FROM Contacts
GROUP BY Name, ClientId
HAVING COUNT(*) > 1
) AS g
ON u.Name = g.Name AND u.ClientId = g.ClientId
WHERE Phone IS NOT NULL AND Email IS NOT NULL
UNION
SELECT u.* FROM Contacts u
INNER JOIN (
SELECT Name, ClientId, Count(*) AS ct FROM Contacts
GROUP BY Name, ClientId
HAVING COUNT(*) = 1
) AS h
ON u.Name = h.Name AND u.ClientId = h.ClientId
如果需要联合更多的查询,那没什么大不了的,但似乎可能有更好的方法来处理这个问题。有什么建议吗?
编辑:示例数据
Name | Phone | Email | ClientId
------------------------------------------------------
Person1 | NULL | NULL | 42
Person1 | 555-555-5555 | test@blah.org | 42
Person2 | NULL | NULL | 21
Person2 | NULL | NULL | 21
Person3 | 555-555-5555 | NULL | 79
Person3 | NULL | NULL | 79
Person4 | 555-555-5555 | NULL | 49
Person4 | NULL | test@blah.org | 49
Person5 | 555-555-5555 | NULL | 91
Person5 | 555-555-5555 | test@blah.org | 91
Person6 | 555-555-5555 | NULL | 91
查询后返回数据集--
Name | Phone | Email | ClientId
------------------------------------------------------
Person1 | 555-555-5555 | test@blah.org | 42
Person2 | NULL | NULL | 21
Person3 | 555-555-5555 | NULL | 79
Person4 | 555-555-5555 | test@blah.org | 49
Person5 | 555-555-5555 | test@blah.org | 91
Person6 | 555-555-5555 | NULL | 91
Person4 的数据合并是理想情况,但不一定是我在这个 SO 问题中寻找的答案。在填写姓名或电子邮件的情况下,只要没有任何数据丢失,我就可以重复使用。
试试这个
WITH CT AS(
SELECT Name, Phone, Email, CompanyId,
--This part determines duplicates by field
RN = ROW_NUMBER()OVER(PARTITION BY Name,CompanyId ORDER BY Name)
FROM Contacts
)
select FROM CT WHERE email <> '' and phone <> ''
要select 根据特定列重复
ROW_NUMBER()OVER(PARTITION BY {column1}, {column2}.....
这将 return 每个 name
的 "best" 行。最佳意味着额外列的最大数量(Mail
、Phone
)不为空。
select top(1) with ties *
from Contact
order by row_number() over (partition by Name order by
case when Phone is null then 0 else 1 end + case when Email is null then 0 else 1 end desc)
这肯定有效..
select
name,max(phone),max(email),clientid
from
Table t
group by name,clientid