虚拟主机网站淘客网站建设,展厅设计装饰公司,centos7安装wordpress,外贸网站源码怎么建背景
今天发现某个黄页爬取的数据有部分重复了#xff0c;原本我用的公司详情页的url进行md5来作为主键做upsert入#xff0c;但后面在核验数据时发现有些详情url虽是同一间公司的#xff0c;但路由上有细微差别导致写入了重复的公司数据#xff0c;所以要想办法清理掉重复…背景
今天发现某个黄页爬取的数据有部分重复了原本我用的公司详情页的url进行md5来作为主键做upsert入但后面在核验数据时发现有些详情url虽是同一间公司的但路由上有细微差别导致写入了重复的公司数据所以要想办法清理掉重复的公司 除了有表id外我的表里还有一个local_id字段用于保存页面上的内部id下面就从这个字段入手进行
实现方案
第一步首先是看看有多少重复的记录这个很简单通过group by local_id就能找到了如下
SELECTlocal_id
FROMresult.table_name
WHEREsources xxxx
GROUP BYlocal_id
HAVINGCOUNT ( local_id ) 1 )结果数量是91条这就意味着有91个公司的信息有重复的
然后我想看看总共有多少条对应的重复公司记录
SELECT*,ROW_NUMBER ( ) OVER ( PARTITION BY local_id ORDER BY company_id ) AS rn
FROM(SELECT* FROMresult.table_name WHEREsources xxxx AND local_id IN ( SELECT local_id FROM result.table_name WHERE sources xxxx GROUP BY local_id HAVING COUNT ( local_id ) 1 ) ORDER BYlocal_id ) T) 查询结果是是182条也就意味着重复的公司记录里每家公司信息都是重复了1条
接着下来的问题是怎样实现把多余的删除只保留一条的目的这里用到的pgsql的分区功能他会根据指定字段值给相同的值增加一个编号以下是我这个场景的示例
SELECT*
FROM(SELECT*,ROW_NUMBER () OVER ( PARTITION BY local_id ORDER BY company_id ) AS rn FROM(SELECT* FROMresult.table_nameWHEREsources xxxx AND local_id IN ( SELECT local_id FROM result.table_name WHERE sources xxxx GROUP BY local_id HAVING COUNT ( local_id ) 1 ) ORDER BYlocal_id ) T ) t1
WHERErn 2;通过这条sql可以把每个local_id重复的记录找出来删除后就能达到只保留一条记录的目的了如果重复的记录不只一条只要把最后的条件改成 2 就可以了。
如果本文解决了你的问题请点赞精神支持一下这能鼓励我继续做更多的分享谢谢