2016-08-11 18 views
1

私はテーブルから重複レコードを削除/選択されたこの優れたSQLコードがあります。削除重複が

WITH CTE AS(
SELECT UserId, A, B, 
RN = ROW_NUMBER()OVER(PARTITION BY A, B ORDER BY UserId) 
FROM Users 
) SELECT * FROM CTE WHERE RN > 1 

をしかし、それは元のレコードせずにすべての重複を選択します。重複+オリジナル(+1)はどのように選択できますか?

答えて

5

私はあなたがcount(*)ではなくrow_number()を使用したいと思う:

WITH CTE AS (
     SELECT UserId, A, B, COUNT(*) OVER (PARTITION BY A, B) as cnt 
     FROM Users 
    ) 
SELECT * 
FROM CTE 
WHERE CNT > 1; 
0

あなたが重複したレコードと一緒に元のレコードを参照したい場合、あなたは自分があなたのCTEに参加することができます。

WITH CTE AS (
    SELECT UserID, A, B, rn=ROW_NUMBER() OVER (PARTITION BY A, B, ORDER BY UserID) 
    FROM Users) 
SELECT c1.*, c2.* 
FROM CTE c1 
INNER JOIN CTE c2 ON c1.RN = 1 AND c2.RN > 1