繁体   English   中英

SQL查询以查找第一列中的值相同的两列中的重复项

[英]Sql Query to find duplicates in 2 columns where the values in first column are same

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

表:

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

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

谢谢。

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

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

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

请尝试以下...

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值。

如果您有任何问题或意见,请随时发表评论。

附录

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

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 );

尝试这个:

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

听起来您希望两行都返回找到重复项的位置。 这应该工作:

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
;


您可以使用以下查询。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM