使用 window 函数检查哪些记录有重复

Check which all records have duplicate using window function

我正在使用 ROW_NUMBER() 查找重复项,封装在 CTE 下。我正在使用 ROW_NUMBER() 因为我还希望有一个列显示 table.

中存在多少重复行

下面的代码只给出大于 1 的记录。即第 2 行和第 3 行。但是我如何包含重复记录的第 1 行?

如果我删除了 T>1,则输出还包含没有重复的记录,例如部分为“'0020R5',100”的记录。

DDL:

DROP TABLE #TEST
CREATE TABLE #TEST
(
    PART VARCHAR(30),   
    ALTPART int
)

INSERT #TEST    
SELECT '15-AB78',100 UNION ALL
SELECT '15-AB78',110 UNION ALL
SELECT '16-A9-1',100 UNION ALL
SELECT '16-A9-1',110 UNION ALL
SELECT '16-B97-2',100 UNION ALL
SELECT '16-B97-2',110 UNION ALL
SELECT '0020R5',100 

查询:

WITH TEST(PART,ALTPART,T) AS   
(  
    SELECT PART,ALTPART,ROW_NUMBER() OVER (PARTITION BY PART ORDER BY ALTPART ASC) AS T FROM #TEST   
)  
SELECT PART,ALTPART,T 
FROM TEST  
WHERE T>1
ORDER BY PART
GO

Current output:
 '15-AB78',110,2 
 '16-A9-1',110,2 
 '16-B97-2',110,2

预期结果:

'15-AB78',100,1
'15-AB78',110,2 
'16-A9-1',100,1 
'16-A9-1',110,2 
'16-B97-2',100,1 
'16-B97-2',110,2

您需要添加另一个window函数来计算每个组中的重复项数。

大致如下:

WITH TEST(PART,ALTPART,DuplicateNum, DuplicateCnt) AS   
(  
    SELECT PART,ALTPART,
        -- Number each duplicate
        ROW_NUMBER() OVER (PARTITION BY PART ORDER BY ALTPART ASC) AS DuplicateNum,
        -- Count duplicates
        COUNT() OVER (PARTITION BY PART ) AS DuplicateCnt,
    FROM #TEST   
)  
SELECT PART, ALTPART, DuplicateNum
FROM TEST  
WHERE DuplicateCnt > 1
ORDER BY PART