Найти записи, имеющие количество> 1 - PullRequest
0 голосов
/ 24 мая 2019

У меня есть таблица, содержащая дубликаты записей.Эти дубликаты сгруппированы в повторяющиеся группы и также имеют индекс (номер записи) в соответствующей группе.В соответствующей таблице у меня есть все записи, даже те, которые не являются дубликатами.

Мне нужно выбрать только те записи, которые имеют минимум 2 записи в повторяющейся группе.поэтому я использовал счет, группировать и иметь.

проблема в том, что я получаю странный результат при этом.На следующем снимке экрана показаны все записи, включая записи с одной записью в дублирующейся группе.Есть около 10 тысяч групп, содержащих 2 или более дубликатов

image

The issue is that as soon I uncomment the commented section, I only get 16 records instead of all with > 1 entries in a group and only groupid's 2 to 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 ]

2 голосов
/ 24 мая 2019

Это слишком долго для комментария (так как он содержит 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;

Это вернуло бы все строки, где есть более 1 строки с одинаковым значением для DubGroupID, где BatchCheckJobID имеет значение '59aae39d7ee949fc8c9cce2a5efc2a5e'.

В отличие от вашего запроса, использующего IN, это также не вызовет 2 сканирования таблицы.

1 голос
/ 24 мая 2019

Вы проверяете DubGroupID IN (но выбираете здесь счетчик).Сделайте что-нибудь, как показано ниже -

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