2012-05-21 89 views
0

我在SQL Server中類似這樣的表:SQL服務器重複記錄刪除最早的記錄,並保持最新

Emp#  CourseID  DateComplete  Status 
1   Course1   21/05/2012   Failed 
1   Course1   22/05/2012   Passed 
2   Course2   22/05/2012   Passed 
3   Course3   22/05/2012   Passed 
4   Course1   31/01/2012   Failed 
4   Course1   28/02/2012   Passed 
4   Course2   28/02/2012   Passed 

試圖捕捉最新記錄每門課每個EMP#。如果同一天課程已經嘗試在同一天捕獲「通過」課程記錄。

思考這些方針的東西:

SELECT DISTINCT ..... 
     INTO Dup_Table 
     FROM MainTable 
GROUP BY ........ 
HAVING COUNT(*) > 1 

DELETE MainTable 
     WHERE Emp# IN (SELECT Emp# FROM Dup_Table) 

INSERT MainTable SELECT * FROM Dup_Table 

Drop Table Dup_Table 
GO 

但不知道這是

  1. 的最佳方法和
  2. 如何將所有攜帶的Emp#/ courseID/DateComplete /狀態一起。
+2

什麼版本的SQL Server您使用的最後一個記錄? –

+2

單獨針對SQL Server多次提出此問題及其變體。你可以從這個問題開始:[SQL - 如何刪除重複的行?](http://stackoverflow.com/questions/18932/sql-how-can-i-remove-duplicate-rows)。其*鏈接*部分有許多其他人。 –

回答

6
;WITH cte 
    AS (SELECT Row_number() OVER (partition BY EMPID, courseid ORDER BY 
       DateComplete 
       DESC, 
       status DESC) RN 
     FROM MainTable) 
DELETE FROM cte 
WHERE RN > 1 
+0

你不需要子查詢和'#temp'表。你可以使用我的[這裏回答](http://stackoverflow.com/a/3822833/73226) –

+0

的方法是的。在「Maintable」問題中只涉及一個表格。從MainTable中定義的CTE中刪除從'Maintable'刪除行 –

+2

感謝Martin,我不知道從CTE刪除記錄會反映到Main表中。 +1在你的答案。 –

0

您可以通過分區,以便使用row_number()的範圍,以獲得

Select * 
From (
    Select *, 
      Row_Number() Over (Partition By Emp#, CourseID Order By DateComplete DESC, Case When Status = 'Passed' Then 1 Else 2 End ) AS RecordNumber 
    From #Emp)Z 
Where Z.RecordNumber = 1