バージョン 2005 以降の SQL Server では、ROW_NUMBER
で CTE (Common Table Expression) を使用できます。 重複を排除する機能:
;WITH LastPerUser AS ( SELECT ID, UserID, ClassID, SchoolID, Created, ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum' FROM dbo.YourTable ) SELECT ID, UserID, ClassID, SchoolID, Created, FROM LastPerUser WHERE RowNum = 1
プレ>この CTE は、データを
UserID
で「分割」します。 、および各パーティションのROW_NUMBER
関数は、1 から始まり、Created DESC
の順に並べられた連番を渡します。 - したがって、最新の行はRowNum = 1
になります。 (各UserID
ごとに ) これは、その後の SELECT ステートメントで CTE から選択したものです。同じ CTE を使用して、重複を簡単に削除することもできます:
;WITH LastPerUser AS ( SELECT ID, UserID, ClassID, SchoolID, Created, ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum' FROM dbo.YourTable ) DELETE FROM dbo.YourTable t FROM LastPerUser cte WHERE t.ID = cte.ID AND cte.RowNum > 1
プレ>同じ原則が適用されます:いくつかの基準でデータを「グループ化」(またはパーティション化) し、各データ パーティションのすべての行に連続番号を付け、「パーティション化された行番号」の値が 1 より大きい行は
DELETE
.