数据库去重有很多方法,下面列出目前理解与使用的方法

第一种

通过group by分组,然后将分组后的数据写入临时表然后再写入另外的表,对于没有出现再group by后面的field可以用函数max,min提取,效率较高
--适合情况:这种情况适合重复率非常高的情况,一般来说重复率超过5成则可以考虑用这个方法
--优点:对于重复率高的数据集的去重,十分推荐用这种方法
--缺点:uuid不能用max或min提取,如果需要去重的数据集中包含uuid则十分尴尬

create temp table tmp_data1 as
select [field1],[field2]...,max(field_special),min(field_special) from group by [field1],[field2]...;

insert into [table] select * from tmp_data1;

第二种

通过union去除完全重复的行,效率较高
--适合情况:这种方法只适合去除完全重复的行

select * from table1
union
select * from table1;

第三种

通过group by加id加not in,即先用group by分组,然后取出该分组下最大或最小的id组成集合,然后配合not in过滤掉重复的数据,效率很低,可以尝试配合临时表(测试发现依旧很慢)

--适合情况:由于该种方法效率很低,所以不推荐使用,如果数据量不大的情况下可以用这种方法,数据量只要上了100万就会很慢很慢


delete from [table] where id not in (select max(id) from table1 group by [field1],[field2]...);

第四种

通过group by加having加in,即先用group by分组,然后用having count(*)>1取出分组数量大于1的行(即重复的行),然后用in删除重复行,效率较高
--适合情况:一条数据大概只有一到两三条重复,这种方法一次只能删除重复数据的一条,如果有些数据有几百次重复那就会累死,其实也可以使用函数做一个循环,但这样的效率就不高了

delete from [table] where id in (select max(id) from [table] group by [field1],[field2]... having count(*)>1);

第五种

使用窗口函数加id,即可以使用窗口函数将数据分组,并将每个分组按行排号,并将行号与id(唯一id)存入一个集合里,这样就可以根据这个集合来取处重复行的id,即通过行号>1,
-- 然后根据id删除重复行,效率很高(100万数据,重复9万,时间: 14.596s)
--适合情况:该种方法效率很高,特别推荐使用,但需要了解窗口函数以及其中的一些关键词的意义

--row_number() 为返回的记录定义个行编号
--over 与row_number()函数配套使用
--partition by [field1],[field2]... 根据指定的字段分组

delete from [table] where id in (select id from (select row_number() over (partition by [field1],[field2]...), id from [table]) as t where t.row_number>1);

第六种,对于不同的情况,不同的数据量级,可以配合使用以上五种方法,灵活使用。

转载于:https://www.cnblogs.com/holden1/p/9946564.html

postgresql数据库去重方法相关推荐

  1. postgresql设置postgres密码_django项目时配置postgresql数据库的方法

    python3.8使用pycharm在开发django项目时配置postgresql数据库的方法 django默认支持sqlite3,如果想使用最近最热门的关系型数据库postgresql时,那该怎么 ...

  2. php+pg+query+更新,PHP连接及操作PostgreSQL数据库的方法详解

    本文实例讲述了PHP连接及操作PostgreSQL数据库的方法.分享给大家供大家参考,具体如下: PostgreSQL扩展在默认情况下在最新版本的PHP 5.3.x中是启用的. 可以在编译时使用--w ...

  3. linux postgresql 创建数据库,Linux下创建Postgresql数据库的方法步骤

    Linux下创建Postgresql数据库的方法步骤 前言 PostgreSQL (也叫 Postgres)是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行. ...

  4. linux机器启动pg数据库命令,Linux下创建Postgresql数据库的方法步骤

    前言 PostgreSQL (也叫 Postgres)是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行.因为之前用默认的配置创建pgsql数据库,导致root ...

  5. Oracle数据库去重方法

    法一: 通过distinct查出所有去重数据 创建临时表放入去重后的数据,清空原表,把临时表的数据放入原表 create table 临时表 as select distinct * from 原表: ...

  6. php如何连接postgresql,php如何连接和操作PostgreSQL数据库

    这篇文章主要介绍了php连接与操作PostgreSQL数据库的方法,以实例形式较为详细的分析了php连接PostgreSQL数据库以及进行读取与增加.修改.删除等技巧,具有一定的参考借鉴价值,需要的朋 ...

  7. SQL5 将查询后的列重新命名(数据库的几种去重方法)

    牛客网题目 描述 题目:现在运营需要查看用户来自于哪些学校,请从用户信息表中取出学校的去重数据. 示例:user_profile 根据示例,你的查询应返回以下结果: 示例1 输入: drop tabl ...

  8. PostgreSQL 数据库检测到 ShareLock 死锁的处理方法

    PostgreSQL 是一个免费数据库,对于处理分析型+交易型混合型系统来说确实很不错,特别是版本的升级到11.2后性能提升很多,很多运行机制跟Oracle越来越接近,确实很强大,但是开源系统确实存在 ...

  9. linux登录pg数据库命令,PostgreSQL数据库pg_dump命令行不输入密码的方法

    对于PostgreSQL数据库的备份按照官方手册的方法之一就是采用"SQL Dump"的方式(另一种方式是直接备份文件系统中的文件,可参考官方手册). 基本用法如下: pg_dum ...

最新文章

  1. Html5的页面基本结构标签,HTML5:简介和文档基本结构
  2. 不丹的启示:用国民幸福总值替代GDP
  3. [转]使用QT开发GoogleMap瓦片显示和下载工具
  4. leetcode 164. 最大间距(桶排序)
  5. 前端开发 标签的属性和值 0228 需演练
  6. 阿里面试题剖析,如何保证消息不被重复消费?
  7. 如何将多个Excel合并到一个Excel中?
  8. PHP 错误与异常 笔记与总结(6)将错误日志保存在系统日志中
  9. usleep头文件_Linunx的sleep,usleep,select,nonasleep对比与应用
  10. CentOS下配置java
  11. IDEA jclasslib插件安装
  12. ReactNative Ios打包流程
  13. qq传输文件为什么服务器忙,win10系统qq接收文件慢一直显示传输连接中的教程
  14. 360极速浏览器取消默认迅雷下载的正确方法
  15. 以AI赋能企业数智化转型 容联“云端”服贸会完美收官
  16. 感性和理性,个人的看法
  17. scratch零基础
  18. VLC在web系统中应用(x-vlc-plugin 即如何把VLC嵌入HTML中)第一篇
  19. Android 画中画(视频)
  20. 韩国计算机硕士累吗,在韩国读研究生有多心累...

热门文章

  1. Java中Semaphore(信号量) 数据库连接池
  2. Zip4j开源jar包的简单使用
  3. 【SHARE】WEB前端学习资料
  4. uni-app 组件传值
  5. 廖雪峰老师Git教程代码梳理
  6. Python与操作系统有关的模块
  7. Java zip解压,并遍历zip中的配置文件 .cfg或.properties
  8. 算法:字符串消除问题的数学证明
  9. Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析
  10. 整理:Android apk 框架 布局 集锦