删除数据库表中重复数据的方法是_oracle删除重复数据保留一条

删除数据库表中重复数据的方法是_oracle删除重复数据保留一条一直使用Postgresql数据库,有一张表是这样的: DROP TABLE IF EXISTS "public"."devicedata"; CREATE T

删除数据库表中重复数据的方法

一直使用Postgresql数据库,有一张表是这样的:

DROP TABLE IF EXISTS "public"."devicedata";
CREATE TABLE "public"."devicedata" (
  "Id" varchar(200) COLLATE "pg_catalog"."default" NOT NULL,
  "DeviceId" varchar(200) COLLATE "pg_catalog"."default",
  "Timestamp" int8,
  "DataArray" float4[]
)

CREATE INDEX "timeIndex" ON "public"."devicedata" USING btree (
  "Timestamp" "pg_catalog"."int8_ops" DESC NULLS LAST,
  "DeviceId" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);

ALTER TABLE "public"."devicedata" ADD CONSTRAINT "devicedata_pkey" PRIMARY KEY ("Id");

主键为Id,是通过程序生成的GUID,随着数据表的越来越大(70w),即便我建立了索引,查询效率依然不乐观。

使用GUID作为数据库的主键对分布式应用比较友好,但是不利于数据的插入,可以使用类似ABP的方法生成连续的GUID解决这个问题。

为了进行优化,计划使用DeviceId与Timestamp作为主键,由于主键会自动建立索引,使用这两个字段查询的时候,查询效率可以有很大的提升。不过,由于数据库的插入了很多的重复数据,直接切换主键不可行,需要先剔除重复数据。

使用group by

数据量小的时候适用。对于我这个70w的数据,查询运行了半个多小时也无法完成。

DELETE FROM "DeviceData"
WHERE "Id"
NOT IN (
SELECT max("Id")
FROM "DeviceData_temp"
GROUP BY "DeviceId", "Timestamp"
);

使用DISTINCT

建立一张新表然后插入数据,或者使用select into语句。

SELECT DISTINCT "Timestamp", "DeviceId"
INTO "DeviceData_temp"
FROM "DeviceData";
-- 删除原表
DROP TABLE "DeviceData";
-- 将新表重命名
ALTER TABLE "DeviceData_temp" RENAME TO "DeviceData";

不过这个问题也非常大,很明显,未来的表,是不需要Id列的,但是DataArray也没有了,没有意义。

如果SELECT DISTINCT “Timestamp”, “DeviceId”, “DataArray”,那么可能出现”Timestamp”, “DeviceId”重复的现象。

使用ON CONFLICT

如果我们直接建立新表格,设置好新的主键,然后插入数据,如果重复了就跳过不就行了?但是使用select into是不行了,重复的数据会导致语句执行中断。需要借助upsert(on conflict)方法。

INSERT INTO "DeviceData_temp"
SELECT * FROM "DeviceData"
on conflict("DeviceId", "Timestamp") DO NOTHING;
-- 删除原表
DROP TABLE "DeviceData";
-- 将新表重命名
ALTER TABLE "DeviceData_temp" RENAME TO "DeviceData";

执行不到100s就完成了,删除了许多重复数据。

参考文献

https://blog.csdn.net/wendred/article/details/84704042

原文地址:https://www.cnblogs.com/podolski/archive/2022/09/30/16745080.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/4709.html

(0)
上一篇 2023-06-08
下一篇 2023-06-08

相关推荐

  • redis docker镜像_docker导入镜像

    redis docker镜像_docker导入镜像上一期我们介绍了几种常见的构建镜像方式,并给出了功能对比、决策树等作为选型参考。本期我们将演示如何使用 Alpine 构建一个 Redis 镜像。 Alpine 系统使用 apk 包管理工具,文中相关

    2023-06-02
    155
  • 倒转列表顺序:Python .reverse方法

    倒转列表顺序:Python .reverse方法Python是一种高级编程语言,它可以轻松地实现各种算法和数据结构。Python中的列表(List)是一种特殊的数据结构,它可以用来存储一系列有序的元素,这些元素可以是数字、字符串、对象等等。Python提供了许多方法来操作列表,其中一个非常便利的方法是.reverse(),它可以将列表的顺序反转。

    2024-02-29
    87
  • Python位移计算器:将二进制位移动到指定位置

    Python位移计算器:将二进制位移动到指定位置Python是一种流行的通用编程语言,具有强大的运算能力和丰富的库。在Python中,位操作是一种常见的计算方法。本文将介绍一个Python位移计算器,该计算器可以将给定的二进制数位移动到指定的位置。

    2024-01-19
    98
  • MySQL实验 内连接优化order by+limit 以及添加索引再次改进 – G

    MySQL实验 内连接优化order by+limit 以及添加索引再次改进 – GMySQL实验 内连接优化order by+limit 以及添加索引再次改进 在进行子查询优化双参数limit时我萌生了测试更加符合实际生产需要的ORDER BY + LIMIT的想法,或许我们也可以

    2023-03-18
    155
  • 解决MySql客户端秒退(找不到my.ini)[通俗易懂]

    解决MySql客户端秒退(找不到my.ini)[通俗易懂]问题说明(环境:windows7,MySql8.0) 今天安装好MySql后启动MySql服务 启动服务都失败的就不要往下看了,自行百度解决。 打开客户端秒退,但在cmd中是可以使用数据库的。 正常来

    2023-01-27
    158
  • 搜索circ_search索引器

    搜索circ_search索引器该方法提供了4种方式让你编写查询语句中的 WHERE 子句: 注解( 所有的数据将会自动转义,生成安全的查询语句。 ) 1. 简单的 key/value 方式: $this->db->where(&…

    2023-01-25
    153
  • Linux中如何将Python添加到系统路径中

    Linux中如何将Python添加到系统路径中在Linux系统中,系统路径就是一组由操作系统定义的目录列表,用于存放可执行文件的路径。当我们在终端中输入某个命令时,系统会在这些路径中查找该命令的可执行文件,并执行该文件。

    2024-02-28
    91
  • 使用Python对List进行排序的方法

    使用Python对List进行排序的方法排序是编程中非常基础的操作之一,它可以帮助我们更好地组织和处理数据。在Python中,有多种方法可以对List进行排序。本文将从多个方面对使用Python对List进行排序的方法进行详细阐述。

    2024-05-20
    73

发表回复

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