Определите столбцы, вызывающие дубликаты - PullRequest
0 голосов
/ 16 марта 2020

У меня есть таблица, которая загружается с данными. Он НЕ ДОЛЖЕН содержать дубликаты идентификаторов, но это не идеальный мир, люди допускают ошибки и дубликаты. Моя таблица выглядит так, но со многими, МНОГИМИ столбцами:

ID    col_a    col_b    col_c    col_d
1     1        d        f        e    
2     r        g        v        s  
2     r        s        v        s
3     dd       ee       tt       ww
3     rf       DD       tt       ww
3     dd       DD       tt       ww
3     rf       ee       tt       ww
4     a        a        a        a

, как вы можете видеть, cloumn col_b вызывает дубликат для ID = 2, а col_a и col_b вызывают дубликаты для ID = 3. Я могу определить идентификаторы с повторяющимися строками с простым запросом, подобным следующему:

select * from (select ID,  count row from TABLE  group by ID) where ROW > 1;

, это будет возвращать что-то вроде:

ID    ROW
2     2
3     4

, но что ДЕЙСТВИТЕЛЬНО мне поможет, так это запрос, который будет возвращать что-то вроде это:

ID    col_a    col_b    col_c    col_d    ROW
2              TRUE                       2
3     TRUE     TRUE                       4

... или любое другое решение, которое выделит не только дублированные идентификаторы, но и столбцы, которые их вызывают.

О, я использую DB2.

Ответы [ 2 ]

1 голос
/ 16 марта 2020
SELECT  ID 
        ,CASE WHEN COUNT(DISTINCT Col_a) >1 THEN 'TRUE' ELSE '' END AS Col_a
        ,CASE WHEN COUNT(DISTINCT Col_b) >1 THEN 'TRUE' ELSE '' END AS Col_b
        ,CASE WHEN COUNT(DISTINCT Col_c) >1 THEN 'TRUE' ELSE '' END AS Col_c
        ,CASE WHEN COUNT(DISTINCT Col_d) >1 THEN 'TRUE' ELSE '' END AS Col_d  
        ,COUNT(1) AS [Row]
FROM      #Table
GROUP BY  ID
HAVING    COUNT(1)>1
ORDER BY  ID
1 голос
/ 16 марта 2020
select id
       , case when c_a = 1 then null else 'True' end COL_A
       , case when c_b = 1 then null else 'True' end COL_B
       , case when c_c = 1 then null else 'True' end COL_C
       , case when c_d = 1 then null else 'True' end COL_D
       , c ROW
from (select id
            , count(distinct col_a) c_a
            , count(distinct col_b) c_b
            , count(distinct col_c) c_c
            , count(distinct col_d) c_d
            , count(*) c
      from test
      group by id)

Вот демоверсия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...