# 创建表
create table if not exists t_duplicate (
name varchar(255) not null,
age int not null
);
# 插入测试数据
insert into t_duplicate(name, age) values('a', 1);
insert into t_duplicate(name, age) values('a', 2);
select name, count(*) count
from t_duplicate
group by name
having count > 1;
group by name:根据 name 字段分组。count(*):计算每个分组的记录数量。having count > 1:在分组后筛选分组的记录数 > 1 的分组。查询结果:
| name | count |
|---|---|
| a | 2 |
select *
from t_duplicate
where name in (
select name
from t_duplicate
group by name
having count(*) > 1
)
name 分组,筛选分组的记录数 > 1 的分组,即查询重复的 name。in 筛选 name 重复的记录。查询结果:
| name | age |
|---|---|
| a | 1 |
| a | 2 |
select `name`, count
from (
select name, (count(*) over (partition by name)) as count
from t_duplicate
) t
where count > 1
partition by name:按照 name 字段分区,相同的 name 值在一个分区。count(*) over:计算每个分区的记录数。count > 1:筛选分区记录数 > 1 的数据。查询结果:
| name | count |
|---|---|
| a | 2 |
| a | 2 |
……