Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 选择SQL Server中重复记录的子集_Sql Server_Group By_Duplicates_Ssms 2016 - Fatal编程技术网

Sql server 选择SQL Server中重复记录的子集

Sql server 选择SQL Server中重复记录的子集,sql-server,group-by,duplicates,ssms-2016,Sql Server,Group By,Duplicates,Ssms 2016,我需要在SQL Server 2016中选择重复记录的子集。下面是数据集和使用的代码。我只需要选择以红色突出显示的重复项。基本上,我只需要那些重复的记录,这些记录具有匹配的LName、FName、dateOfBirth、StreetAddress值,并且在源中具有nave NUll。同时,我只需要那些在上述字段中也匹配并且源值为“Company XYZ”的记录 我的输出如下所示: 您可以使用行号: WITH cte AS ( SELECT *,ROW_NUMBER() OVER(PARTIT

我需要在SQL Server 2016中选择重复记录的子集。下面是数据集和使用的代码。我只需要选择以红色突出显示的重复项。基本上,我只需要那些重复的记录,这些记录具有匹配的LName、FName、dateOfBirth、StreetAddress值,并且在源中具有nave NUll。同时,我只需要那些在上述字段中也匹配并且源值为“Company XYZ”的记录

我的输出如下所示:


您可以使用
行号

WITH cte AS (
 SELECT *,ROW_NUMBER() OVER(PARTITION BY LName,Fname,DateOfBirth,StreetAddress 
                            ORDER BY ID DESC) rn
 FROM #Dataset
)
SELECT *
FROM cte 
WHERE rn > 1
ORDER BY ID;

编辑:

WITH cte AS (
SELECT *, 
  ROW_NUMBER() OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress 
                    ORDER BY ID DESC) rn,
  SUM(CASE WHEN Source = 'Company XYZ' THEN 1 ELSE 0 END) 
               OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) AS cnt
FROM #Dataset
)
SELECT *
FROM cte 
WHERE rn > 1
  AND cnt > 0
  AND [Source] IS NULL
ORDER BY ID;

编辑2

WITH cte AS (
SELECT *, 
  SUM(CASE WHEN Source IS NULL THEN 1 ELSE 0 END) OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) c1,
  SUM(CASE WHEN Source = 'Company XYZ' THEN 1 ELSE 0 END) OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) AS c2,
  COUNT(*) OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) c3
FROM #Dataset
)
SELECT *
FROM cte 
WHERE c1 > 0
  AND c2 > 0
  AND c3 > 1
  AND Source IS NULL
ORDER BY ID;

谢谢卢卡斯·索兹达。我已经试过了。这不是一个选择。即使有了这个数据集,我也得到了一个Id为8的记录。但我不需要it@enigma6205你可以添加额外的条件。我只是重新安排了我的代码和屏幕截图,使之更真实。请运行您的代码,您将看到警告在哪里。代码的第二个版本几乎可以满足我的需要。但它只适用于3个或更多副本。这对亚当斯密街有效。但它没有选择我截图上以红色突出显示的其他内容。我只需要调整“rn>=”非常感谢@谜团6205最后的方法:不完全理解你为什么要加入这个表格。如果要显示重复项,请分组并计数,告诉您有多少重复行具有这些值。只需按列分组并添加计数(*)。
WITH cte AS (
SELECT *, 
  SUM(CASE WHEN Source IS NULL THEN 1 ELSE 0 END) OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) c1,
  SUM(CASE WHEN Source = 'Company XYZ' THEN 1 ELSE 0 END) OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) AS c2,
  COUNT(*) OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) c3
FROM #Dataset
)
SELECT *
FROM cte 
WHERE c1 > 0
  AND c2 > 0
  AND c3 > 1
  AND Source IS NULL
ORDER BY ID;