sql查询如何删除5列相同的行并在Postgres中保留1列
我以前见过有人问这个问题,但不是在博士后,也不是有5个专栏。我正在使用Postgres 9.4,我有一个很大的位置表,其中有一些重复项。我想检查5个字段是否重复,它们是:城市、州、zipcode、纬度、经度我尝试过其他类似的方法,但即使在我更改名称以匹配表和列之后,它仍不断给我错误。我的很多行都是这样的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
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使用这些工具非常方便。