mysql查询将具有不同字段的重复记录分组

y1aodyip  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(292)

我有一个t1表,表中有id、c1、c2和c3列。我使用下面的查询来查找重复的记录

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

现在我想按c3列对所有重复记录进行分组。我该怎么做?注:我不期待
从t1组中通过c2、c3选择计数(id)>1的组\u concat(id);
我想得到所有在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)
kuarbcqp

kuarbcqp1#

SELECT GROUP_CONCAT(id)
FROM T1
WHERE C2 IN
(    
  SELECT C2
  FROM T1
  GROUP BY C2
  HAVING COUNT(id)>1
)
GROUP BY C3
nkoocmlb

nkoocmlb2#

在派生表中,我们可以 GROUP BYC2 并确定他们的数量。 C2 count大于1的值基本上是重复的(出现在多行中)。
将此结果集联接到上的主表 C2 . 这将有助于我们得到一个额外的列显示 C2 数一数每一行。
现在,我们可以在 C3 使用 COUNT(DISTINCT ...) ,考虑计数大于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          |

db fiddle视图

相关问题