1. 方案一(复制表)
—根据rowId复制去掉重复后的数据到备份表
select * into cm_device_ip_idc_temp1 from (SELECT * FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY uuid,zh_label ORDER BY (SELECT 1)) AS rid,*
FROM cm_device_ip_idc_llx_0719) cte WHERE cte.rid != 2) t
—查询相关数量
SELECT count(*) FROM cm_device_ip_idc_temp1
—删除目标表
DROP TABLE cm_device_ip_idc_llx_0719
–将备份表的数据复制到目标表
select * into cm_device_ip_idc_llx_0719 from cm_device_ip_idc_temp1
–查询备份表
SELECT * FROM cm_device_ip_idc_llx_0719
2. 方案二(根据pgsql库中自带的编号ctid)https://www.cnblogs.com/lottu/p/5613098.html
— 去重(数据量比较小的情况): 我们知道rowid在oracle有个重要的作用;被用作表记录去重;同理 ctid在postgresql里面同样可以使用。
现在演示下;
delete from cm_device_ip_idc_llx_071901 where ctid not in (select min(ctid) from cm_device_ip_idc_llx_071901 group by uuid);
— 去重(数据量大的情况): 我们知道rowid在oracle有个重要的作用;被用作表记录去重;同理 ctid在postgresql里面同样可以使用。
现在演示下;【查出需要删除的重复数据,重复数据不会特别多;比较上述的数据量大就会出现问题;再者下面sql走索引】
delete from cm_device_ip_idc where ctid in (select min(ctid) from cm_device_ip_idc group by uuid HAVING count(1) > 1);
—查询对应的数量是否正确
SELECT count(*) FROM cm_device_ip_idc_llx_071901