伪SQL?名字和姓氏重复但城市不同的所有记录?

伪SQL?名字和姓氏重复但城市不同的所有记录?,sql,sql-server,database,Sql,Sql Server,Database,我需要找到所有的记录,名字是重复的,姓氏是重复的,但是城市对于名字重复的记录是不同的 因此,我的数据如下所示: FirstName LastName CustomerFileLocation City ---------------------------------------------------------------------- Joe Smith c:\file1\File1.txt Dallas

我需要找到所有的记录,名字是重复的,姓氏是重复的,但是城市对于名字重复的记录是不同的

因此,我的数据如下所示:

FirstName    LastName    CustomerFileLocation          City
----------------------------------------------------------------------
   Joe        Smith         c:\file1\File1.txt         Dallas
   Joe        Jones         c:\File2\File1.txt         New York
   Joe        Smith         c:\File3\File1.txt         New Mexico City
   Harry      Smith         c:\File4\File1.txt         Boca Raton
   Joe        Smith         c:\File3\File1.txt         Dallas
   Michael    Smith         c:\File1\File1.txt         Dallas
我希望查询返回

   Joe        Smith         c:\file1\File1.txt         Dallas
   Joe        Smith         c:\File3\File1.txt         New Mexico City
我写了以下内容来查找匹配的FirstName和LastName。但我不知道该怎么说和城市不匹配

SELECT        
   dbo.TblFileCache.FirstName, dbo.TblFileCache.LastName, 
   dbo.TblFileCache.ClaimFilePath, dbo.TblFileCache.Skip
FROM
   dbo.TblFileCache 
INNER JOIN
   (SELECT        
       FirstName, LastName, COUNT(*) AS CountOf
    FROM 
       dbo.TblFileCache AS tblFileCache_1
    GROUP BY 
       FirstName, LastName 
    HAVING         
       (COUNT(*) > 1)) AS dt ON dbo.TblFileCache.FirstName = dt.FirstName 
                             AND dbo.TblFileCache.LastName = dt.LastName
WHERE        
    (dbo.TblFileCache.Skip = 0)
ORDER BY 
    dbo.TblFileCache.FirstName, dbo.TblFileCache.LastName

要获取原始数据中一组用户名具有多个城市的所有行,可以使用窗口函数:

select t.*
from (select t.*,
             min(city) over (partition by FirstName, LastName) as mincity,
             max(city) over (partition by FirstName, LastName) as maxcity
      from dbo.TblFileCache t
     ) t
where mincity <> maxcity;
如果您希望每个城市有一行,可以在此基础上进行聚合:

select FirstName, LastName, min(CustomerFileLocation) as CustomerFileLocation, city
from (select t.*,
             min(city) over (partition by FirstName, LastName) as mincity,
             max(city) over (partition by FirstName, LastName) as maxcity
      from dbo.TblFileCache t
     ) t
where mincity <> maxcity
group by FirstName, LastName, City;

为什么您的查询只返回达拉斯的一行?数据中有两行,请解释清楚。1.首先,我们可以找到所有行集合,其中First aname多次出现,last name多次出现。但是,您可能希望在所有行集合中,一对名、姓出现多次?2.那么,您想要表格中城市唯一的所有行中的行吗?或者每个集合中具有该集合唯一城市的行?3.跳过和点餐怎么样。或者,也许到了,但是城市是不同的,因为记录中的名称是重复的,你只是重复地说,在具有相同名称对的行中,城市可以是不同的?