列出两个文件之间的重复项并删除

时间:2012-12-29 14:37:43

标签: sql sql-server-2008

使用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

3 个答案:

答案 0 :(得分: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

试试这个

答案 1 :(得分: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
;

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

您可以看到DELETE直接定位CTE,在这种情况下是允许的,因为CTE只引用一个表。

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

答案 2 :(得分: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。