查找计数 > 1 的记录
Find records having count > 1
我有一个 table 包含重复的记录。这些重复项被分组在重复组中,并且在相应的组中也有一个索引(记录号)。在相关的 table 中,我有所有记录,甚至是那些不重复的记录。
我只需要 select 那些在重复组中至少有 2 个条目的记录。所以我使用了计数、分组依据和拥有。
问题是这样做时我得到了奇怪的结果。以下屏幕截图显示了所有记录,包括重复组中只有一个条目的记录。大约有 10k 个组包含 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;
非常感谢任何提示。
您正在检查 DubGroupID IN(但在此处选择计数)。执行以下操作-
......
AND DubGroupID IN (SELECT DubGroupID
FROM [SOMETABLE]
GROUP BY DubGroupID
HAVING COUNT(DubGroupID) > 1)
.........
这个评论太长了(因为它包含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;
这将 return 所有行,其中超过 1 行的值与 DubGroupID
相同,其中 BatchCheckJobID
的值为 '59aae39d7ee949fc8c9cce2a5efc2a5e'
。
与您使用 IN
的查询不同,这也不会导致 table 的 2 次扫描。
我有一个 table 包含重复的记录。这些重复项被分组在重复组中,并且在相应的组中也有一个索引(记录号)。在相关的 table 中,我有所有记录,甚至是那些不重复的记录。
我只需要 select 那些在重复组中至少有 2 个条目的记录。所以我使用了计数、分组依据和拥有。
问题是这样做时我得到了奇怪的结果。以下屏幕截图显示了所有记录,包括重复组中只有一个条目的记录。大约有 10k 个组包含 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;
非常感谢任何提示。
您正在检查 DubGroupID IN(但在此处选择计数)。执行以下操作-
......
AND DubGroupID IN (SELECT DubGroupID
FROM [SOMETABLE]
GROUP BY DubGroupID
HAVING COUNT(DubGroupID) > 1)
.........
这个评论太长了(因为它包含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;
这将 return 所有行,其中超过 1 行的值与 DubGroupID
相同,其中 BatchCheckJobID
的值为 '59aae39d7ee949fc8c9cce2a5efc2a5e'
。
与您使用 IN
的查询不同,这也不会导致 table 的 2 次扫描。