使用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 :(得分: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。