2017-08-09 65 views
1

我有一個大表(130列)。它是按月份(jan,feb,mar,...)分隔的每月數據集。每個月我都會得到一小組重複的行。我想刪除其中的一行,刪除哪一行並不重要。如何測試if語句中的項目列表

此查詢似乎工作正常,當我只選擇我想篩選dups的ID時,但是當我從表中選擇所有行時,包括dups在內的所有行中的所有"*"。我的目標是過濾出dups並將結果集插入到一個新表中。

SELECT DISTINCT a.[ID] 
FROM MonthlyLoan a 
    JOIN (SELECT COUNT(*) as Count, b.[ID] 
      FROM MonthlyLoan b 
      GROUP BY b.[ID]) 
     AS b ON a.[ID] = b.[ID] 
WHERE b.Count > 1 
and effectiveDate = '01/31/2017' 

任何幫助將不勝感激。

+0

使用該查詢的CTE或子查詢,內部連接的,結果回到MonthLoan on ID的SELECT *上,你應該得到你想要的。基本上,您有一個查詢,可以爲您提供所需的唯一標識,通過將該標識加入原始表中,您可以爲這些行獲取完整的一組列。 – pmbAustin

+0

如果您的** ID **被複制,您所有需要的是按ID分組並使用「HAVING COUNT(ID)> 1' – jean

+0

不幸的是,這是一個很常見的問題。從下面的@Phoenix看到答案,我們實際上使用該解決方案時沒有出現問題。 – Eli

回答

1

這將顯示每個ID的所有副本:

;WITH Duplicates AS 
(
    SELECT ID 
      rn = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) 
    FROM MonthlyLoan 
) 
SELECT ID, 
     rn 
FROM Duplicates 
WHERE rn > 1 

或者,您也可以設置rn = 2找到每個ID直接複製。

+1

你可以更進一步,實際上通過'CTE'從'MonthlyLoad'直接刪除。只需將'CTE'後面的查詢更新爲'DELETE'而不是'SELECT'即可。實際上,我們在某些供應商提供的不清潔數據中使用了這些數據。 – Eli

0

由於您的ID被dupped(A DUPPED ID !!!!)

所有你需要使用HAVING子句中的彙總。 請看下面的例子。

declare @tableA as table 
(
    ID int not null 
) 

insert into @tableA 
values 
(1),(2),(2),(3),(3),(3),(4),(5) 

select ID, COUNT(*) as [Count] 
from @tableA 
group by ID 
having COUNT(*) > 1 

結果:

ID   Count 
----------- ----------- 
2   2 
3   3 

要插入的結果爲#Temporary表:

select ID, COUNT(*) as [Count] 
into #temp 
from @tableA 
group by ID 
having COUNT(*) > 1 

select * from #temp