2012-12-29 78 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.

相關問題