sql查询如何删除具有5列相同的行并在Postgres中保留1列

标签 sql postgresql sql-delete

我以前见过有人问过这个问题,但在 Postgres 中没有,而且没有 5 列。我正在使用 Postgres 9.4,我有一个很大的位置表,其中有一些重复项。我想检查 5 个字段是否重复,它们是:city,state,zipcode,latitudes,longitudes 我已经尝试过其他方法,例如 find rows that multiple columns are identical using SQL query但即使在我更改名称以匹配我的表和列之后,它仍然给我错误。我的很多行看起来像这样

  1. 伊利诺伊州芝加哥 60475 41.881 -87.6245
  2. 芝加哥伊利诺伊州 60475 41.853 -87.6846
  3. 伊利诺伊州芝加哥 60475 41.881 -87.6245
  4. 芝加哥伊利诺伊州 60475 41.890 -87.6273

有许多具有相同的城市、州、邮政编码和略有不同的纬度和经度。在上面的列表中,只有#1 和#3 是相同的,所以我想删除 1 而保留另一个。我正在尝试找到正确的方法来执行此操作而不删除额外的行任何建议都会很棒...... 我在查询时遇到了这个错误 错误:列引用“城市”不明确 第 1 行:选择城市、州

Select city,state
FROM zipss JOIN 
 (SELECT city,state, count(*)
  FROM zipss
  GROUP BY city,state
  HAVING count(*) >=2) dupl on zipss.city = dupl.city and zipss.state = dupl.state;

最佳答案

在 Postgres 中,您可以使用 ctid 来达到这个目的。这是一个你真的不应该使用的内置列。但是,如果表上没有主键,那么它很有用:

delete from table
    where ctid not in (select max(ctid)
                       from table t
                       group by city, state, zipcode, latitude, longitude
                      );

对于五列的每个组合,这应该保留具有最大 ctid 的行。

关于sql查询如何删除具有5列相同的行并在Postgres中保留1列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32341830/

相关文章:

mysql - 结合两个复杂的查询

sql - 对具有外键约束的表进行非常慢的 SQL DELETE 查询

SQL:通过是和否显示表及其作业

mysql - 选择显示第一个唯一值的行

string - 在 Golang 中将字符串传递给准备好的语句

postgresql - 如何避免 postgres 弄乱实体的 ID

php - 使用 PHP 在 mysql 中删除不起作用

android - 删除带有 header 和参数的请求 Volley

mysql - 组合三个 SELECT 语句时出现问题,UNION 不起作用

python - 在多个模式中执行 alembic 升级