postgresal去重_postgresql数据库去重方法

postgresal去重_postgresql数据库去重方法数据库去重有很多方法,下面列出目前理解与使用的方法第一种通过groupby分组,然后将分组后的数据写入临时表然后再写入另外的表,对于没有出现再groupby后面的field可以用函数max,min提取,效率较高–适合情况:这种情况适合重复率非常高的情况,一般来说重复率超过5成则可以考虑用这个方法–优点:对于重复率高的数据集的去重,十分推荐用这种方法–缺点:uuid不能用max或min提取…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

第一种

通过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://javaforall.net/187204.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVA的除法计算

    JAVA的除法计算我们都知道在JAVA中”/“是取整,”%”是取余,那么我们要是想算类似1÷10=0.1怎么算?方法一DecimalFormat //定义方法 publicstaticStringChufa(inta,intb){ //“0.00000000”确定精度 DecimalFormatdF=newDecimalFormat(“0.00000000”); …

    2022年5月24日
    57
  • 计算机三级网络技术考过指南

    计算机三级网络技术考过指南原文链接:计算机三级网络技术考过指南题库下载链接(50积分是CSDN上调的,不是我上传时设置的。更新版本请大家自行搜索):计算机三级网络技术无纸化考试模拟软件(2018.3)用Markdown重写后的带完整标签的版本:计算机三级网络技术考过指南(带完整标签版)目录计算机三级网络技术考过指南前言(必读)1.基础准备1.1题库1.2二…

    2022年4月8日
    51
  • 电脑蓝屏0X000000ED_0X000000ED

    电脑蓝屏0X000000ED_0X000000ED说到电脑问题,就不得不提蓝屏的问题。最近有位朋友的电脑开机的时候,并没有进入正常的启动程序,反而进入了蓝色界面,显示代码0x000000ed,不知道为什么会这样,也不知道如何去解决。下面就来看看蓝屏0x000000ed的原因和解决方法详解吧!蓝屏代码0x000000ed的原因详解!蓝屏现象,是我们在使用电脑中最常见的一种启动问题,而蓝屏显示的代码就是帮助我们去了解蓝屏的原因以及解决方法的主要依据。…

    2022年10月8日
    2
  • ARM_控制器

    ARM_控制器ARM_控制器1.GPIO控制器:(gpio口的通用函数接口定义在gpiolib.c文件中,声明则在gpio.h中)linux-3.10\include\linux\gpio.hlinux-3

    2022年8月4日
    9
  • linux系列之常用运维命令整理笔录

    本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新free-m其中:m表示兆,也可以用g,注意都要小写Men:表示物理内存统计total:表示物理内存总数(total=used+free)use…

    2022年4月7日
    40
  • SpringBoot接收LocalDate类型数据

    SpringBoot接收LocalDate类型数据@ApiOperation(“按月份查询日记集”)@PostMapping(“selectAll”)publicServiceResult<Object>selectAll(@RequestParam@NotNull@DateTimeFormat(iso=DateTimeFormat.ISO.DATE)LocalDatelocalDate){List<MysqlDiary>list=mysqlDiaryService…

    2022年6月24日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号