【问题标题】:mysql query to group duplicate records with a different fieldmysql查询用不同的字段对重复记录进行分组
【发布时间】:2018-11-12 08:16:04
【问题描述】:

我有一个表 T1,其中包含列 id、C1、C2 和 C3。我正在使用以下查询来查找重复记录

Select group_concat(id) from T1 group by C2 having count(id) >1;

现在我想按 C3 列对所有重复记录进行分组。我该怎么做? 注意:我不期待

从T1组中选择group_concat(id) by C2,C3 count(id) >1;

我想获取所有在 C2 上具有重复值的记录,并仅根据 C3 对它们进行分组,而不考虑它们的 C2 值

id C1 C2 C3

1  a  3   A

2  b  2   A

3  c  2   A

4  d  2   B

5  e  3   C

在上述数据中,1,5 是 C2 值为 3 的重复记录,2,3,4 是 C2 值为 2 的重复记录。我想要一个输出

A - has 2 duplicates (with C2 values 2 and 3 )
B - has 1 duplicate (with C2 value 2)
C - has 1 duplicate (with C2 value 3)

【问题讨论】:

  • 帮助我们帮助您 - 请分享一些示例数据以及您尝试获得的结果。

标签: mysql


【解决方案1】:
  • 在派生表中,我们可以在C2GROUP BY 并识别它们的计数。 C2 计数大于 1 的值基本上是重复的(出现在不止一行中)。
  • 将此结果集加入C2 上的主表。这将帮助我们获得一个额外的列,显示每一行的 C2 计数。
  • 现在,我们可以使用 COUNT(DISTINCT ...)C3 使用条件聚合,考虑到计数大于 1 的情况。

试试:

SELECT 
  t.C3, 
  COUNT(DISTINCT IF(dt.count_C2 > 1, t.C2, NULL)) AS duplicates 
FROM 
  your_table AS t 
JOIN
(
  SELECT
    C2,
    COUNT(id) AS count_C2
  FROM your_table
  GROUP BY C2
) AS dt
  ON dt.C2 = t.C2 
GROUP BY t.C3

结果

| C3  | duplicates |
| --- | ---------- |
| A   | 2          |
| B   | 1          |
| C   | 1          |

View on DB Fiddle

【讨论】:

    【解决方案2】:
    SELECT GROUP_CONCAT(id)
    FROM T1
    WHERE C2 IN
    (    
      SELECT C2
      FROM T1
      GROUP BY C2
      HAVING COUNT(id)>1
    )
    GROUP BY C3
    

    【讨论】:

    • 如果我的第一个 group by 有多个属性怎么办,比如 Group by C2,C1
    • @Jerry 如果您尝试检查会发生什么怎么办?如果这是一个有效的用例,你应该在之前提到它
    • 在这种情况下,我可以有多个 where 子句,这是实现这一目标的最佳方式吗?
    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2015-10-04
    相关资源
    最近更新 更多