2012-01-20 54 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。我想我被寵壞了! –