Trong SQL Server từ phiên bản 2005 trở lên, bạn có thể sử dụng CTE (Biểu thức bảng chung) với ROW_NUMBER
chức năng loại bỏ các bản sao:
;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 này "phân vùng" dữ liệu của bạn theo UserID
và đối với mỗi phân vùng, ROW_NUMBER
hàm đưa ra các số tuần tự, bắt đầu từ 1 và được sắp xếp theo Created DESC
- vì vậy hàng mới nhất nhận được RowNum =1
(cho mỗi UserID
) là những gì tôi chọn từ CTE trong câu lệnh SELECT sau nó.
Sử dụng cùng một CTE, bạn cũng có thể dễ dàng xóa các bản sao:
;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
Nguyên tắc tương tự cũng được áp dụng:bạn "nhóm" (hoặc phân vùng) dữ liệu của mình theo một số tiêu chí, bạn đánh số liên tục tất cả các hàng cho mỗi phân vùng dữ liệu và những hàng có giá trị lớn hơn 1 cho "số hàng được phân vùng" sẽ bị loại bỏ bởi mã <> XÓA .