2012-01-20 53 views
0

可能重复:
Combine multiple results in a subquery into a single comma-separated value
Concat groups in SQL ServerGROUP_CONCAT在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 

有谁知道解决方案吗?例子是一个加号!

+1

你不能在集合函数中使用group by。我认为你的意思是'通过身份证组'# –

+0

@marc_s谢谢! –

+0

我试图从数据库中删除dups。 MSSQL并没有使这个简单,这是“搜索”,并在任何地方的DB任务中一直使用。 首先应该有一种方法来防止dups,但这不是我的数据库和应用程序。 –

回答

1

在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清除。

0

只需使用distinct删除重复项。这听起来像你使用group_concat加入重复,而实际上并不想使用它的价值。在这种情况下,MySQL也有distinct,你可以使用已经:

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

而且,你不能group by您在聚合函数中使用的东西;我想你的意思是group by id。我在上面的例子中纠正了它。

+0

谢谢@Justin Satyr! 我的意图是使用数据列进行分组。显然,MSSQL不允许你这样做。我正在从MySQL转移到MSSQL。我想我被宠坏了! –