【问题标题】:Identify columns causing duplicates识别导致重复的列
【发布时间】:2020-06-27 07:38:21
【问题描述】:

我有一个加载数据的表。它不应该包含重复的 ID,但它不是一个完美的世界,人们会犯错误并发生重复。我的表看起来像这样,但有很多很多列:

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 重复。我可以通过如下简单查询来识别具有重复行的 ID:

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

...或任何其他解决方案,不仅会突出显示重复的 ID,还会突出显示导致它们的列。

哦,我正在使用 DB2。

【问题讨论】:

  • 如果ID 应该是唯一的,那么为什么不使用唯一约束或作为主键来定义它?
  • 正如我所提到的......这不是一个完美的世界,人们会犯错误......而其他人......在这种情况下是我:) 必须处理这些错误
  • 需要定义表中记录的顺序。您如何确定(3)的第二行是射频。插入到表中的记录不一定是顺序。您是否还有其他列可以确定 id 中记录的顺序
  • 这就是为什么您应该将列定义为唯一的 - 以防止错误
  • 伙计们,我完全明白应该做什么。事实上,我完全同意你的看法。但在这种情况下,我们从客户那里获得数据并被告知“处理它”。我无法控制源数据,也无法提供任何会改变事情的反馈。它基本上是“让它工作”

标签: sql db2


【解决方案1】:
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)

Here is a demo

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      相关资源
      最近更新 更多