2012-05-21 88 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