mysql查询用不同的字段对重复记录进行分组

标签 mysql

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

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

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

Select group_concat(id) from T1 group by C2,C3 having 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)

最佳答案

  • 在派生表中,我们可以在 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

关于mysql查询用不同的字段对重复记录进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53258136/

相关文章:

mysql - ORACLE SQL查询-如何使用select查询获取所有数据并将 "(null)"值替换为 '~'

mysql - 连续非空值的计数

java - Android SQLite 查询

php - 如何在 magento 1.8.1 上管理 log_url_info.ibd

mysql - Kafka Mysql Connectorplugin.path配置

mysql - 在 MySQL InnoDB 中存储大于 max_allowed_pa​​cket 的 BLOB 的最佳方法

PHP-jQuery : Display a timer on each table row where end time is not set

c# - ADO.NET 需要 >5 秒才能以 ASP.NET 形式打开 MySql 连接

php - 从一个表创建下拉列表并将所选值输入到另一个表(相同的 MySQL 数据库)

mysql - 从mysql表中获取年、月、周、日、小时数据的最大值