在SQL Server作爲2005版及更高版本,可以使用CTE(公共表表達式)與ROW_NUMBER
功能來消除重複:
;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
清除。
你不能在集合函數中使用group by。我認爲你的意思是'通過身份證組'# –
@marc_s謝謝! –
我試圖從數據庫中刪除dups。 MSSQL並沒有使這個簡單,這是「搜索」,並在任何地方的DB任務中一直使用。 首先應該有一種方法來防止dups,但這不是我的數據庫和應用程序。 –