由于某种原因,查询会返回除2条记录以外的所有记录,即使它在技术上符合条件

时间:2018-08-10 14:32:10

标签: sql sql-server

我今天在我的一个应用程序中发现了一些奇怪的东西-实际上有人向我指出了。我有一个包含一堆客户的表,并让用户运行报告以查找潜在的重复项。这是初步的重复搜索,因此我按名字和姓氏的前几个字符进行搜索。

假设我有以下客户列表:

tblA
ClientID        FName         LName
1               Carol         Villa
2               Carol         Villa
3               Gainy         Brimes
4               Gainy         Brimes

这是我正在使用的查询:

 select ClientID, FName, LName 
 from (select t.*,  count(*) over (partition by (substring(FName,0,4)), (substring(LName,0,4)), dob) as cnt  from tblClients t   ) t  
 where cnt > 1  
 order by  FName, LName

如果我对此表运行此查询,我只会得到以下记录:

ClientID      FName        LName
1             Carol        Villa
2             Carol        Villa

这不是在向我显示盖恩·布里姆斯,是什么原因?

1 个答案:

答案 0 :(得分:1)

答案已经由Koosh自己发现。
由于DOB用于窗口函数的分区中,因此不匹配的DOB可能会忽略某些“可疑”重复项。

但是这里有一些测试脚本来演示这种效果:

declare @tblClients table (ClientID int, FName varchar(30), LName varchar(30), dob int);
insert into @tblClients (ClientID, FName, LName, dob) values
 (1,'Carol','Villa',100)
,(2,'Carina','Vilpo',100)
,(3,'Garcy','Brimes',100)
,(4,'Garry','Bricks',200)
;

select ClientID, FName, LName
, dob, cnt, rn
, CASE WHEN cnt > 1 THEN 'Has Partial Dups' ELSE 'No Partials Dups' END as ThereBeDups
from 
(
 select ClientID, FName, LName, dob,  
 count(*) over (partition by dob, substring(FName,1,3), substring(LName,1,3)) as cnt,
 row_number() over (partition by dob, substring(FName,1,3), substring(LName,1,2) order by ClientID desc) as rn
 from @tblClients
) t
--where cnt > 1
order by  FName, LName;

结果:

ClientID    FName   LName   dob cnt rn  ThereBeDups
--------    -----   -----   --- --- --  ----------------
2           Carina  Vilpo   100 2   1   Has Partial Dups
1           Carol   Villa   100 2   2   Has Partial Dups
3           Garcy   Brimes  100 1   1   No Partial Dups
4           Garry   Bricks  200 1   1   No Partial Dups