【问题标题】:How to drop duplicate rows from postgresql sql table如何从 postgresql sql 表中删除重复的行
【发布时间】:2021-06-13 23:19:34
【问题描述】:

date        | window  | points  |    actual_bool      |         previous_bool          |       creation_time        | source 
------------+---------+---------+---------------------+---------------------------------+----------------------------+--------
 2021-02-11 |     110 |     0.6 |                   0 |                               0 | 2021-02-14 09:20:57.51966  | bldgh
 2021-02-11 |     150 |     0.7 |                   1 |                               0 | 2021-02-14 09:20:57.51966  | fiata
 2021-02-11 |     110 |     0.7 |                   1 |                               0 | 2021-02-14 09:20:57.51966  | nfiws
 2021-02-11 |     150 |     0.7 |                   1 |                               0 | 2021-02-14 09:20:57.51966  | fiata
 2021-02-11 |     110 |     0.6 |                   0 |                               0 | 2021-02-14 09:20:57.51966  | bldgh
 2021-02-11 |     110 |     0.3 |                   0 |                               1 | 2021-02-14 09:22:22.969014 | asdg1
 2021-02-11 |     110 |     0.6 |                   0 |                               0 | 2021-02-14 09:22:22.969014 | j
 2021-02-11 |     110 |     0.3 |                   0 |                               1 | 2021-02-14 09:22:22.969014 | aba
 2021-02-11 |     110 |     0.5 |                   0 |                               1 | 2021-02-14 09:22:22.969014 | fg
 2021-02-11 |     110 |     0.6 |                   1 |                               0 | 2021-02-14 09:22:22.969014 | wdda
 2021-02-11 |     110 |     0.7 |                   1 |                               1 | 2021-02-14 09:23:21.977685 | dda
 2021-02-11 |     110 |     0.5 |                   1 |                               0 | 2021-02-14 09:23:21.977685 | dd
 2021-02-11 |     110 |     0.6 |                   1 |                               1 | 2021-02-14 09:23:21.977685 | so
 2021-02-11 |     110 |     0.5 |                   1 |                               1 | 2021-02-14 09:23:21.977685 | dar
 2021-02-11 |     110 |     0.6 |                   1 |                               1 | 2021-02-14 09:23:21.977685 | firr
 2021-02-11 |     110 |     0.8 |                   1 |                               1 | 2021-02-14 09:24:15.831411 | xim
 2021-02-11 |     110 |     0.8 |                   1 |                               1 | 2021-02-14 09:24:15.831411 | cxyy
 2021-02-11 |     110 |     0.3 |                   0 |                               1 | 2021-02-14 09:24:15.831411 | bisd
 2021-02-11 |     110 |     0.1 |                   0 |                               1 | 2021-02-14 09:24:15.831411 | cope
 2021-02-11 |     110 |     0.2 |                   0 |                               1 | 2021-02-14 09:24:15.831411 | sand
 ...

我在 testdb 中名为 testtable 的 postgresql 表中有以下数据集。

我不小心复制了数据库并复制了行。

如何删除重复项?

第 1 行和第 5 行是该帧中的副本,第 2 行和第 4 行也是副本。

我以前从未使用过 sql 来删除重复项,我不知道从哪里开始。

我试过了

select creation_time, count(creation_time) from classification group by creation_time having count (creation_time)>1 order by source;

但它所做的只是告诉我我每天有多少重复,

像这样

       creation_time        | count 
----------------------------+-------
 2021-02-14 09:20:57.51966  |    10
 2021-02-14 09:22:22.969014 |    10
 2021-02-14 09:23:21.977685 |    10
 2021-02-14 09:24:15.831411 |    10
 2021-02-14 09:24:27.733763 |    10
 2021-02-14 09:24:38.41793  |    10
 2021-02-14 09:27:04.432466 |    10
 2021-02-14 09:27:21.62256  |    10
 2021-02-14 09:27:22.677763 |    10
 2021-02-14 09:27:37.996054 |    10
 2021-02-14 09:28:09.275041 |    10
 2021-02-14 09:28:22.649391 |    10
...

每个 creation_timestamp 中应该只有 5 条唯一记录。

它没有向我显示重复项,即使我这样做了,它也不知道如何删除它们。

【问题讨论】:

  • 你有id栏吗?
  • 不,我不应该做一个吗?
  • 每个表都应该有这样一列,例如用于识别特定记录...
  • 我第一次做sql,我没有意识到,我现在可以修复它并在删除重复项后添加一个id列吗?
  • 在删除更有用的内容之前添加一个 id 列。因为识别重复项很容易,但是如果您无法正确处理它们,则很难将其删除...

标签: sql postgresql duplicates sql-delete


【解决方案1】:

要删除很多行。我建议只重新创建表格:

create table new_classification as
    select distinct c.*
    from classification c;

验证数据后,如果您确实需要,可以重新加载:

truncate table classification;

insert into classification
    select *
    from new_classification;

这个过程应该比删除 90% 的行快得多。

【讨论】:

  • 这是个好主意! :)
  • omg 非常感谢,它成功了,你为我节省了很多时间。你能解释一下从分类 c 中选择不同的 c.* 是什么吗?的命令呢?
  • SELECT DISTINCT * 返回没有重复的表格内容
  • 那么 c.* 和 c 做了什么?
  • @anarchy 。 . . c 是表别名。 c.* 返回 c 所指的所有列。
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2018-02-08
  • 2023-03-03
相关资源
最近更新 更多