首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用不同字段对重复记录分组的mysql查询

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

Stack Overflow用户
提问于 2018-11-12 08:16:04
回答 2查看 676关注 0票数 1

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

代码语言:javascript
复制
Select group_concat(id) from T1 group by C2 having count(id) >1;

现在,我想将所有重复的记录按列C3分组。我该怎么做呢?注:我不期望

group_concat(id)按C2从T1组中选择,C3计数(Id) >1;

我希望在C2上获得所有具有重复值的记录,并且只根据C3对它们进行分组,而不管它们的C2值如何。

代码语言:javascript
复制
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的重复记录。

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-12 08:43:43

  • 在派生表中,我们可以在GROUP BY上使用C2并识别它们的计数。计数超过1的C2值基本上是重复的(发生在多个行中)。
  • 将此结果集连接到C2上的主表。这将帮助我们获得一个额外的列,显示对每一行的C2计数。
  • 现在,考虑到计数大于1的情况,我们可以在C3上使用COUNT(DISTINCT ...)进行条件聚合。

尝试:

代码语言:javascript
复制
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

结果

代码语言:javascript
复制
| C3  | duplicates |
| --- | ---------- |
| A   | 2          |
| B   | 1          |
| C   | 1          |

View on DB Fiddle

票数 1
EN

Stack Overflow用户

发布于 2018-11-12 08:29:36

代码语言:javascript
复制
SELECT GROUP_CONCAT(id)
FROM T1
WHERE C2 IN
(    
  SELECT C2
  FROM T1
  GROUP BY C2
  HAVING COUNT(id)>1
)
GROUP BY C3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53258136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档