【问题标题】:Find duplicate values among multiple columns across different rows在不同行的多列中查找重复值
【发布时间】:2016-07-27 12:18:20
【问题描述】:

我有一个包含多个列的数据集,看起来与此类似:

ID1     ID2     ID3      ID4
Blue    Grey    Fuchsia  Green
Black   Blue    Orange   Blue
Green   Green   Yellow   Pink
Pink    Yellow  NA       Orange

我想要做的是计算每个值在四列中重复的次数。例如,这是我想从上面得到的:

ID      Replicates   
Blue    3       
Black   1    
Green   3       
Pink    2
Grey    1
Yellow  2
Fuchsia 1 
Orange  2  

我还希望能够询问在频率 >2 的数据集中存在哪个 ID 值。所以预期的结果是:绿色和蓝色。

对如何在 Oracle 中执行此操作有任何想法吗?谢谢!

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    select c, count(*)
    from
    (
    select ID1 as c from tablename
    union all
    select ID2 as c from tablename
    union all
    select ID3 as c from tablename
    union all
    select ID4 as c from tablename
    )
    group by c
    

    在末尾添加HAVING count(*) > 2,只得到绿色和蓝色。

    【讨论】:

    • 谢谢!如果从查询中删除“as dt”,则上述查询有效。否则它会显示“SQL 命令未正确结束”错误。另外,你能解释一下这个查询的逻辑吗?
    • as dt 已删除。 (ANSI SQL,但 Oracle 不喜欢它......)子查询(派生表)只是将所有数据作为一列返回。 GROUP BY 在那里进行计数。 (并且 HAVING 用于将结果限制为仅出现两次以上的颜色。)
    【解决方案2】:
    SELECT ID, COUNT(*) FROM(
    SELECT ID1 ID FROM TBL UNION ALL
    SELECT ID2 ID FROM TBL UNION ALL
    SELECT ID3 ID FROM TBL UNION ALL
    SELECT ID4 ID FROM TBL ) Q
    GROUP BY Q.ID;
    

    【讨论】:

      【解决方案3】:
      select id, sum(id_cnt)
      (select ID1 as ID,count(*) as id_cnt from tableA group by ID1
      union all
      select ID2,count(*)from tableA group by ID2
      union all
      select ID3,count(*)from tableA group by ID3
      union all
      select ID4,count(*)from tableA group by ID4)
      group by id
      

      输出将类似于

      ID      Replicates   
      Blue    3       
      Black   1    
      Green   3       
      Pink    2
      Grey    1
      Yellow  2
      Fuchsia 1 
      Orange  2 
      

      【讨论】:

        【解决方案4】:

        这是使用 Oracle 的 unpivot 关键字的另一个非常直接的选项:

        select id, count(*) as replicates
        from tbl
        unpivot
        (
          id for original_column_name in (id1, id2, id3, id4)  
        )
        group by id
        

        ...当然,您可以随意添加having 和/或order by 子句。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-23
          相关资源
          最近更新 更多