Sql server 2008 SQL Server 2008中的组_concat

Sql server 2008 SQL Server 2008中的组_concat,sql-server-2008,Sql Server 2008,可能重复: 我希望能够删除重复的内容 SELECT Count(Data) as Cnt, Id FROM [db].[dbo].[View_myView] Group By Data HAVING Count(Data) > 1 在MySQL中,它非常简单: SELECT Count(Data), group_concat(Id) FROM View_myView Group By Data Having Cnt > 1 有人知道解决办法吗?例子是一个加号 只需使用dist

可能重复:

我希望能够删除重复的内容

SELECT Count(Data) as Cnt, Id
FROM [db].[dbo].[View_myView]
Group By Data
HAVING Count(Data) > 1
在MySQL中,它非常简单:

SELECT Count(Data), group_concat(Id)
FROM View_myView
Group By Data
Having Cnt > 1

有人知道解决办法吗?例子是一个加号

只需使用
distinct
删除重复项即可。听起来好像你在使用
group\u concat
来加入重复项,而实际上并不想使用它的值。在这种情况下,MySQL还有一个
独特的
,您可以使用:

SELECT DISTINCT Count(Data) as Cnt, Id
FROM [db].[dbo].[View_myView]
GROUP BY Id
HAVING Count(Data) > 1

此外,您不能按聚合函数中使用的内容进行分组;我想你的意思是按id分组。我在上面的示例中对其进行了更正。

在2005版及更新版本的SQL Server中,您可以使用带有
行号的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
)
SELECT 
   ID, UserID, ClassID, SchoolID, Created,
FROM LastPerUser
WHERE RowNum = 1
;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
此CTE通过
UserID
对您的数据进行“分区”,对于每个分区,
ROW\u 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
)
SELECT 
   ID, UserID, ClassID, SchoolID, Created,
FROM LastPerUser
WHERE RowNum = 1
;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

清除。您不能
根据聚合函数中使用的内容进行分组。我想你的意思是
按id分组
我正在尝试从数据库中删除DUP。MSSQL并没有使这变得简单,这是过度“搜索”的,并且在DB的任何地方的任务中一直使用。首先应该有一种防止DUP的方法,但这不是我的DB和应用程序。谢谢@Justin Satyr!我的意图是使用数据列来分组。显然,MSSQL不允许您这样做。我正在从MySQL迁移到MSSQL。我想我被宠坏了!