Di SQL Server pada versi 2005 dan yang lebih baru, Anda dapat menggunakan CTE (Common Table Expression) dengan ROW_NUMBER
fungsi untuk menghilangkan duplikat:
;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 ini "mempartisi" data Anda dengan UserID
, dan untuk setiap partisi, ROW_NUMBER
fungsi membagikan nomor urut, mulai dari 1 dan diurutkan berdasarkan Created DESC
- jadi baris terbaru mendapat RowNum = 1
(untuk setiap UserID
) yang saya pilih dari CTE dalam pernyataan SELECT setelahnya.
Menggunakan CTE yang sama, Anda juga dapat dengan mudah menghapus duplikat:
;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
Prinsip yang sama berlaku:Anda "mengelompokkan" (atau mempartisi) data Anda dengan beberapa kriteria, Anda secara berurutan memberi nomor semua baris untuk setiap partisi data, dan yang memiliki nilai lebih besar dari 1 untuk "nomor baris yang dipartisi" disingkirkan oleh DELETE
.