在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,但这不是我的数据库和应用程序。 –