1

SQLServerに次のようなテーブルがあります。

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/Statusをすべてまとめる方法。
4

2 に答える 2

7
;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 
于 2012-05-21T10:33:22.447 に答える
2

row_number()最後のレコードを取得するには、by partition と order by scope を使用できます

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
于 2012-05-21T11:39:28.397 に答える