查找计数> 1的记录

时间:2019-05-24 08:47:14

标签: sql sql-server group-by having

我有一个包含重复记录的表。这些重复项被分组为重复组,并且在相应组中也具有索引(记录号)。在相关表中,我具有所有记录,即使不是重复的记录也是如此。

我只需要选择那些记录,在重复组中至少要有2条记录。所以我使用了count,group by和have。

问题是这样做时我得到奇怪的结果。以下屏幕快照显示了所有记录,包括那些在重复组中只有一个条目的记录。大约有1万个群组,其中包含2个或更多重复项

问题在于,我取消注释部分的评论后,就只得到16条记录,而不是一组中具有1个以上条目且只有groupid的2至8条记录...

有人看到我在这里想念的东西吗?

SELECT new_firstname AS firstname,
       new_lastname AS lastname,
       DubGroupID AS groupid,
       RecNumberInDupGroup AS recnr_ingroup
FROM [SOMETABLE]
WHERE BatchCheckJobID = '59aae39d7ee949fc8c9cce2a5efc2a5e'
  AND DubGroupID IN (SELECT COUNT(DubGroupID)
                     FROM [SOMETABLE]
                     GROUP BY DubGroupID
                     HAVING COUNT(DubGroupID) > 1)
ORDER BY groupid,
         recnr_ingroup ASC;

任何提示都值得赞赏。

2 个答案:

答案 0 :(得分:2)

这对注释来说太长了(因为它包含SQL),但是上面的内容不能写成下面的内容吗?

WITH CTE AS(
    SELECT new_firstname AS firstname,
           new_lastname AS lastname,
           DubGroupID AS groupid,
           RecNumberInDupGroup AS recnr_ingroup,
           COUNT(DubGroupID) OVER (PARTITION BY DubGroupID) AS [Count]
    FROM SOMETABLE
    WHERE BatchCheckJobID = '59aae39d7ee949fc8c9cce2a5efc2a5e')
SELECT *
FROM CTE
WHERE [Count] > 1;

这将返回所有行,其中有多于DubGroupID的值为1的行,其中BatchCheckJobID的值为'59aae39d7ee949fc8c9cce2a5efc2a5e'

与使用IN进行查询不同,这也不会导致对该表进行2次扫描。

答案 1 :(得分:1)

您检查DubGroupID IN(但在此处选择count)。做以下事情-

......
AND DubGroupID IN (SELECT DubGroupID 
                 FROM [SOMETABLE]
                 GROUP BY DubGroupID
                 HAVING COUNT(DubGroupID) > 1)
.........