V SQL Serveru od verze 2005 a novější můžete použít CTE (Common Table Expression) s ROW_NUMBER
funkce k odstranění duplicit:
;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
Toto CTE „rozděluje“ vaše data podle UserID
a pro každý oddíl ROW_NUMBER
funkce rozdává sekvenční čísla začínající na 1 a seřazená podle Created DESC
- takže poslední řádek dostane RowNum =1
(pro každé ID uživatele
), což je to, co vyberu z CTE v příkazu SELECT za ním.
Pomocí stejného CTE můžete také snadno odstranit duplikáty:
;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
Platí stejný princip:„seskupujete“ (neboli oddílujete) svá data podle určitých kritérií, postupně očíslujete všechny řádky pro každý datový oddíl a ty s hodnotami většími než 1 pro „číslo rozděleného řádku“ jsou vyřazeny