2012-12-29 80 views
1

使用SQL Server 2008并将两个文件导入到表中。第一个文件(2048)有6,721行,第二个文件有(2209)4,707行,列是:Billed, FirstName, LastName, FileID。表格被称为Claims列出两个文件之间的重复项并删除

需要查询以列出每个FileId(2209和2048),显示每个文件中的重复项并从其中一个重复项中删除重复项。

然此查询:

SELECT firstname 
, lastname 
, duplicatecount = COUNT(1) 
FROM Claims 
WHERE fileid IN (2209, 2048) 
GROUP BY 
firstname 
, lastname 
HAVING COUNT(1) > 1 
ORDER BY COUNT(1) DESC 
+0

在单个文件中是否有重复的可能性,或者您是否希望查找记录也位于文件2048中的文件2209中的记录? – BrianC

+0

你想在每个文件中找到重复项?文件之间?并删除它们? – Mari

回答

0

这会给你在每个文件的副本,

SELECT firstname , lastname , count(*) as duplicatecount 
FROM Claims WHERE fileid IN (2209, 2048) 
GROUP BY firstname , lastname HAVING COUNT(*) > 1 
ORDER BY 1,2 DESC 

试试这个

+0

看起来非常像原始帖子中的查询。 –

+0

是啊@AndriyM,但OP没有说他得到了什么,他提到他想知道每个文件中的重复。然后删除部分我不明白。你有什么想法吗? – Mari

0

你可以尝试这样的事:

WITH counted_and_marked AS (
    SELECT 
    * 
    rnk = ROW_NUMBER() OVER (PARTITION BY firstname, lastname ORDER BY fileid) 
    FROM Claims 
    WHERE fileid IN (2209, 2048) 
) 
DELETE FROM marked_and_counted 
WHERE rnk > 1 
; 

The marked_and_counted公用表格表达式仅简单检索Claims中的所有行,并独立按fileid的顺序排列每(firstname, lastname)的重复项。 DELETE语句然后只删除排名大于1的行。

您可以看到DELETE直接针对CTE,在这种情况下允许,因为CTE仅引用一个表。

此查询将适用于任意数量的文件。它将删除所有的重复项,每个(firstname, lastname)只留下一项。

0

这些是重复的。因此,与您的查询开始:

with todelete as (<your query here>) 
delete from Claims 
    from todelete 
    where todelete.firstname = claims.firstname and 
      todelete.lastname = claims.lastname and 
      fileid = 2209 

你要删除的复制值,不是所有的人,所以你需要指定要删除哪一个。我任意选择了2209.

相关问题