【问题标题】:Sql Query to find duplicates in 2 columns where the values in first column are sameSql Query在第一列中的值相同的2列中查找重复项
【发布时间】:2017-05-04 13:48:47
【问题描述】:

我有一个表,其中第一列包含州,第二列包含邮政编码。我想在同一州找到重复的邮政编码。因此,第一列可以具有相同的值,但我需要在第二列中找到第一列中具有相同值的重复项。

表:

+---+----+------+
| Z | A  |  B   |
+---+----+------+
| 1 | GA | 1234 |
| 2 | GA | 321  |
| 3 | GA | 234  |
| 4 | GA | 9890 |
| 5 | GA | 1234 |
+---+----+------+

查询应该返回有重复的邮政编码的值,即 1234。我有大约 10000 多条记录。

谢谢。

【问题讨论】:

  • 一个邮政编码可以出现在多个州吗?
  • @Rahul - 以下答案对于您所描述的内容是正确的。 The above code gives me each zip code (without duplicates) from each state. => Group by 怎么可能?我建议您在此基础上提供更多示例数据和我们的预期输出。

标签: mysql sql join


【解决方案1】:

尝试使用GROUP BY 查询并保留重复出现的邮政编码。

SELECT A, B
FROM yourTable
GROUP BY A, B
HAVING COUNT(*) > 1

请注意,我们可以按州和邮政编码分组,假设给定的邮政编码对于给定的州只出现一次。

【讨论】:

  • 我想找到重复的邮政编码。上面的代码给了我每个州的每个邮政编码(没有重复)。我想找出哪个州有哪个邮政编码重复。
  • 编辑您的问题并向我们展示您的预期输出。我不知道你想要什么。
  • @Rahul 假设B 列中没有NULL 值,您是否仍然看到使用COUNT(*) 的问题?
【解决方案2】:

请尝试以下...

SELECT Z AS RecordNumber,
       tblTable.A AS State,
       tblTable.B AS ZipCode
FROM tblTable
JOIN ( SELECT A,
              B
       FROM tblTable
       GROUP BY A,
                B
       HAVING COUNT( * ) > 1
     ) AS duplicatesFinder ON tblTable.A = duplicatesFinder.A
                          AND tblTable.B = duplicatesFinder.B
ORDER BY tblTable.A,
         tblTable.B,
         Z;

此语句以一个子查询开始,该子查询选择在源表中出现多次的州和邮政编码的每个唯一组合(在没有表名的情况下,我将其称为 tblTable)。

然后根据州 邮政编码的共享值将此子查询的结果连接到源表。这个JOIN 有效地从我们的结果数据集中消除了源表中具有唯一州/邮政编码组合的所有记录。

然后返回重复的州/邮政编码列表以及与每个配对关联的 Z 的值。

如果您有任何问题或cmets,请随时发表相应的评论。

附录

我的代码已针对使用以下脚本创建的数据库进行了测试...

CREATE TABLE tblTable
(
    Z   INT,
    A   CHAR( 2 ),
    B   INT
);
INSERT INTO tblTable ( Z,
                       A,
                       B )
VALUES ( 1, 'GA', 1234 ),
       ( 2, 'GA', 321 ),
       ( 3, 'GA', 234 ),
       ( 4, 'GA', 9890 ),
       ( 5, 'GA', 1234 );

【讨论】:

    【解决方案3】:

    试试这个:

    select A,B, count(CONCAT_WS('',A,B)) as cnt  from
    (select * from yourtable) as a  group by A,B having count(CONCAT_WS('',A,B))>1
    

    所有重复记录或多条记录的结果:

    GA  1234    2
    

    【讨论】:

      【解决方案4】:

      听起来您希望在找到重复项的地方返回两行。这应该有效:

      with cte1 as (
      select
         A
        ,B
        ,count(1) over (partition by A, B) as counter
      from table_name
      )
      select
         A
        ,B
      from cte1
      where 1=1
        and counter > 1
      order by A, B
      ;
      

      如果想知道总共有多少重复行,可以在最终选择中选择“计数器”字段:

      with cte1 as (
      select
         A
        ,B
        ,count(1) over (partition by A, B) as counter
      from table_name
      )
      select
         A
        ,B
        ,counter
      from cte1
      where 1=1
        and counter > 1
      order by A, B
      ;
      

      【讨论】:

        【解决方案5】:


        您可以使用以下查询。

        SELECT A, B, COUNT(*)
        FROM TABLE_NAME
        GROUP BY A, B
        HAVING COUNT(*) > 1;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-11
          相关资源
          最近更新 更多