代码示例:
在PostgreSQL中查询重复计数及去重查询可以通过多种方法实现。以下是一些详细的例子:
-
查询重复计数:
使用聚合函数count()
配合over()
窗口函数可以查询每个元素的重复计数:SELECT id, name, email, count(*) OVER (PARTITION BY email) AS cnt FROM people;
这将为
people
表中的每行显示email
字段的重复计数。 -
基于单个字段的重复记录查询:
可以通过分组统计并且返回行数大于1的分组来查询重复记录:SELECT at, COUNT(at) FROM table2 GROUP BY at HAVING COUNT(at) > 1;
如果想要查看完整的重复数据,可以使用子查询或者连接查询:
SELECT * FROM table2 WHERE at IN (SELECT at FROM table2 GROUP BY at HAVING COUNT(at) > 1) ORDER BY at;
或者使用自连接查询和
DISTINCT
操作符:SELECT DISTINCT p.* FROM table2 p JOIN table2 d ON p.at = d.at WHERE p.id <> d.id ORDER BY p.at;
-
基于多个字段的重复记录查询:
如果想要找出name
和email
两个字段都重复的数据,可以基于这两个字段进行分组统计:SELECT * FROM people WHERE (name, email) IN ( SELECT name, email FROM people GROUP BY name, email HAVING COUNT(1) > 1) ORDER BY email;
-
使用
DISTINCT ON
进行去重查询:
DISTINCT ON
是PostgreSQL的一个特殊用法,允许指定一个或多个列作为标准去除每个分组的重复行:SELECT DISTINCT ON (column_name) column_name, other_column FROM table_name ORDER BY column_name, other_column;
这将为每个
column_name
值返回第一条记录,其他重复的记录将被去除。 -
使用窗口函数进行去重:
使用ROW_NUMBER()
窗口函数可以对数据进行分组,并为每个分组内的数据分配一个唯一的数字编号:SELECT id, name, email, ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS row_num FROM people;
然后可以基于这个编号去除重复记录。
-
删除重复记录:
如果要删除重复记录,只保留id
最小的一条,可以使用以下查询:DELETE FROM people WHERE id NOT IN (SELECT MIN(id) FROM people GROUP BY email);
这些方法可以根据实际情况和需求进行选择和调整。
喜欢本文,请点赞、收藏和关注!