查找指定列的重复行[重复]

Posted

技术标签:

【中文标题】查找指定列的重复行[重复]【英文标题】:finding duplicates rows for specified columns [duplicate] 【发布时间】:2014-08-05 22:32:18 【问题描述】:

我有如下数据,我需要在其中找到具有相同值的 id(值的计数也应该相同)。 这里 id 1 和 3 具有不同 id 的相同值,所以我想要这 2 个 id 作为输出。 Id is 4 也有相同的链接,但它也有不同的值 333 所以我不想要那个。

id  value
1   111
1   222

2   222
2   333

3   111
3   222

4   111
4   222
4   333

5       111
5       444

我尝试使用存在查询,但它也返回 5,这是错误的。我使用的是 oracle 11G 架构。

输出期望类似于

为相同的 id 提供一些数字以识别重复项。

所以

1 111 1 1 222 1 3 111 1 3 111 1

【问题讨论】:

你使用的是什么关系型数据库? 你能显示你期望的输出吗? 【参考方案1】:

为此,您需要 SET 操作。测试集相等性的一个想法是:A MINUS B EQUALS B MINUS A EQUALS EMPTY SET。

以下是使用 PL/SQL 的方法。

DECLARE
  v_count_1 number;
  v_count_2 number;
BEGIN
  FOR r IN (SELECT DISTINCT id FROM my_table) LOOP
    FOR r_inner in (SELECT DISTINCT id FROM my_table WHERE id > r.id) LOOP
      SELECT count(*)
      INTO v_count_1
      FROM (SELECT value FROM my_table WHERE id = r.id
            MINUS
            SELECT value FROM my_table WHERE id = r_inner.id);

      SELECT count(*)
      INTO v_count_2
      FROM (SELECT value FROM my_table WHERE id = r_inner.id
            MINUS
            SELECT value FROM my_table WHERE id = r.id);

      IF v_count_1 = 0 AND v_count_2 = 0 THEN
        dbms_output.put_line('duplicate IDs: '||r.id||' '||r_inner.id);
      END IF;
    END LOOP;
  END LOOP;
END;
/

【讨论】:

【参考方案2】:

如果只有相互匹配所有值的 ID 是感兴趣的部分,一种方法是检查每个 ID 有多少值,然后匹配具有相同计数的值,并检查匹配了多少值

With R AS (
  SELECT id, Count(1) Dim
  FROM   Table1
  GROUP BY id
)
SELECT r1.id id_1, r2.id id_2
FROM   R r1
       INNER JOIN R r2 ON r1.dim = r2.dim
       INNER JOIN Table1 t1 ON r1.id = t1.id
       INNER JOIN Table1 t2 ON r2.id = t2.id AND t1.value = t2.value 
              AND t2.id > t1.id
GROUP BY r1.id, r2.id
HAVING COUNT(1) = MAX(r1.dim);

t2.id > t1.id 条件是为了避免对重复

要获得与问题中的结果集更相似的结果集,可以将上一个查询再次用作JOIN 的基础

With R AS (
  SELECT id, Count(1) Dim
  FROM   Table1
  GROUP BY id
), M AS (
  SELECT r1.id id_1, r2.id id_2
  FROM   R r1
         INNER JOIN R r2 ON r1.dim = r2.dim
         INNER JOIN Table1 t1 ON r1.id = t1.id
         INNER JOIN Table1 t2 ON r2.id = t2.id AND t1.value = t2.value 
                AND t2.id > t1.id
  GROUP BY r1.id, r2.id
  HAVING COUNT(1) = MAX(r1.dim)
)
SELECT t1.id id_1, t1.value value_1, t1.id base_value
     , t2.id id_2, t2.value value_2, t1.id base_value_2
FROM   M
       INNER JOIN Table1 t1 ON m.id_1 = t1.id
       INNER JOIN Table1 t2 ON m.id_2 = t2.id AND t1.value = t2.value

SQLFiddle demo 与这两个查询。

即使演示是在 SQLServer 2012 中,查询也是仅使用标准命令编写的。

如果 OP 使用 mysqlWITH 中的部分需要转换为 FROM 子句中的子查询。

【讨论】:

以上是关于查找指定列的重复行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

pandas删除数据行中的重复数据行基于dataframe所有列删除重复行基于特定数据列或者列的作何删除重复行删除重复行并保留重复行中的最后一行pandas删除所有重复行(不进行数据保留)

EXCEL中在某列中查找指定文本,返回行对应另一列的数据用啥函数

查找重复行的索引 [重复]

查找重复行的索引 [重复]

在拆分为多个文件的大型数据框中查找重复行和包含重复行的文件

以两列的值为条件显示行 - R [重复]