Sql Query在2列中查找重复项,其中第一列中的值相同

时间:2017-05-04 00:40:35

标签: mysql sql join

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

表:

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

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

谢谢。

5 个答案:

答案 0 :(得分:1)

尝试使用>>> x = [11231] >>> y = [1,2,3,4,5] >>> z = [1,2,3,4,1,1] >>> min([x,y,z], key = len) [11231] 查询并保留一式两份的邮政编码。

GROUP BY

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

答案 1 :(得分:0)

请尝试以下方法......

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;

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

然后,根据State Zip Code的共享值,将此子查询的结果连接到源表。此JOIN有效地从源表中删除了我们的结果数据集中具有唯一State / Zip Code组合的所有记录。

然后返回重复的州/邮政编码列表以及与每个配对相关联的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 );

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

听起来你想要在找到重复项的地方返回两行。这应该有效:

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
;

答案 4 :(得分:0)


您可以使用以下查询。

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