Удаление частично повторяющихся строк (дублирующих данных только в двух столбцах) из таблицы Microsoft SQL Server 2012 - PullRequest
1 голос
/ 19 февраля 2020

У меня есть таблица из примерно 7000 строк, небольшой пример которой приведен ниже:

ORG_ID     Entity_CLASS_ID     Entity_ID     ORGANISATION_ID     ORGANISATION_ROLE_ID    COLUMN_X
-------------------------------------------------------------------------------------------------
781        3                   998           896                 4                       1          
2098       3                   998           3191                4                       66   
3808       4                   998           3191                4                       6555     
780        3                   997           2402                4                       34234     
3807       4                   997           2061                4                       234    
2097       3                   997           2061                4                       6756   

Вы заметите, что для каждого Entity_ID существует несколько строк. Для каждого Entity_ID есть два или более разных Entity_CLASS_ID s.

. Вы можете видеть, что в некоторых случаях две строки для каждого Entity_ID совпадают и с ORGANISATION_ID, но имеют разные Entity_Class_ID s:

ORG_ID     Entity_CLASS_ID     Entity_ID     ORGANISATION_ID     ORGANISATION_ROLE_ID    COLUMN_X     
-------------------------------------------------------------------------------------------------
2098       3                   998           3191                4                       66     
3808       4                   998           3191                4                       6555        

В этом случае я хотел бы удалить строку с идентификатором класса сущности = 3.

Полученная таблица должна быть:

ORG_ID     Entity_CLASS_ID     Entity_ID     ORGANISATION_ID     ORGANISATION_ROLE_ID    COLUMN_X
-------------------------------------------------------------------------------------------------
781        3                   998           896                 4                       1          
3808       4                   998           3191                4                       6555     
780        3                   997           2402                4                       34234     
3807       4                   997           2061                4                       234       

Надеюсь, я ясно объяснил это?

Заранее благодарим за любую помощь в этом.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Мы можем попробовать использовать CTE для этой цели:

WITH cte AS (
    SELECT *, COUNT(*) OVER (PARTITION BY Entity_ID, ORGANISATION_ID) cnt,
        MAX(Entity_CLASS_ID) OVER (PARTITION BY Entity_ID, ORGANISATION_ID) max_ecid
    FROM yourTable
)

DELETE
FROM cte
WHERE
    Entity_CLASS_ID = 3 AND   -- identifies the duplicate
    cnt = 2 AND               -- must occur in a pair
    max_ecid = 4;             -- the other record must be 4

Вот демонстрация, показывающая, что для удаления определены правильные записи:

screen capture from demo below

Демо

1 голос
/ 19 февраля 2020

Вы также можете сделать это, используя exists:

delete from t
where t.Entity_CLASS_ID = 3 and
      exists (select 1
              from t t2
              where t2.Entity_ID = t.Entity_ID and
                    t2.ORGANISATION_ID = t.ORGANISATION_ID and
                    t2.Entity_CLASS_ID <> 3
             );

Это кажется почти прямым переводом вашей формулировки вопроса.

...