Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql查询如何删除5列相同的行并在Postgres中保留1列_Sql_Postgresql_Sql Delete - Fatal编程技术网

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

sql查询如何删除5列相同的行并在Postgres中保留1列,sql,postgresql,sql-delete,Sql,Postgresql,Sql Delete,我以前见过有人问这个问题,但不是在博士后,也不是有5个专栏。我正在使用Postgres 9.4,我有一个很大的位置表,其中有一些重复项。我想检查5个字段是否重复,它们是:城市、州、zipcode、纬度、经度我尝试过其他类似的方法,但即使在我更改名称以匹配表和列之后,它仍不断给我错误。我的很多行都是这样的 芝加哥IL6047541.881-87.6245 芝加哥伊利诺伊州6047541.853-87.6846 芝加哥IL6047541.881-87.6245 芝加哥伊利诺伊州6047541.890

我以前见过有人问这个问题,但不是在博士后,也不是有5个专栏。我正在使用Postgres 9.4,我有一个很大的位置表,其中有一些重复项。我想检查5个字段是否重复,它们是:城市、州、zipcode、纬度、经度我尝试过其他类似的方法,但即使在我更改名称以匹配表和列之后,它仍不断给我错误。我的很多行都是这样的

  • 芝加哥IL6047541.881-87.6245
  • 芝加哥伊利诺伊州6047541.853-87.6846
  • 芝加哥IL6047541.881-87.6245
  • 芝加哥伊利诺伊州6047541.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的行。

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

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


    这应该为五列的每一个组合保留具有最大ctid的行。

    因此,在您的示例中,保留第1行和第2行将是解决方案?使用group by+count方法,您得到了哪些错误?还有@JuanCarlosOropeza,我相信保留2,3,4(或1,2,4)将是解决方案,因为1和3是相同的。@MattH是的,我刚刚证实了。顺便说一句,
    groupby
    是最简单的部分,我想OP需要删除部分。我正在按分区计算行数,所以删除除
    row=1以外的所有行数
    @JuanCarlosOropeza:正是我的想法。:)在上面的示例中,保留第1、2和4行或第1、3和4行是可行的。我得到的错误是:错误:列引用“city”不明确第1行:选择城市,州。我尝试使用两个字段来开始我将更新我的问题并显示它。因此,在您的示例中,您保留第1行和第2行将是解决方案?您使用group by+count方法时遇到了哪些错误?还有@JuanCarlosOropeza,我相信保留2,3,4(或1,2,4)将是解决方案,因为1和3是相同的。@MattH是的,我刚刚证实了。顺便说一句,
    groupby
    是最简单的部分,我想OP需要删除部分。我正在按分区计算行数,所以删除除
    row=1以外的所有行数
    @JuanCarlosOropeza:正是我的想法。:)在上面的示例中,保留第1、2和4行或第1、3和4行是可行的。我得到的错误是:错误:列引用“city”不明确第1行:选择城市,州。我试着用两个字段来开始,我会更新我的问题并展示出来。戈登,真是个怪兽。总是为了胜利而来。你为什么不能让我这样的笨蛋回答?你知道的。。给我们小人物一个回答的机会?;)@马特。我把这个问题留了20分钟才回答;)好。。我从没说过我很快!而且我的解决方案也没有你的那么优雅+1. :] 总是喜欢从你的答案中学习。我知道@MattH,他就像一个忍者。对于OP,这里有一个示例,您可以看到它正在工作。我放了一个ID列,很容易看到哪一行被删除了。哇,很神奇,解决了这个问题。多谢,Postgres使用这些工具非常方便。戈登,真是个怪兽。总是为了胜利而来。你为什么不能让我这样的笨蛋回答?你知道的。。给我们小人物一个回答的机会?;)@马特。我把这个问题留了20分钟才回答;)好。。我从没说过我很快!而且我的解决方案也没有你的那么优雅+1. :] 总是喜欢从你的答案中学习。我知道@MattH,他就像一个忍者。对于OP,这里有一个示例,您可以看到它正在工作。我放了一个ID列,很容易看到哪一行被删除。哇,很神奇,解决了这个问题,非常感谢,Postgres使用这些工具非常方便。