2015-09-01 45 views
0

我曾經見過這個問題,但在Postgres中沒有看到過,但沒有在5列中看到過。我正在使用Postgres 9.4,我有一個大的位置表,有一些重複。有5個領域,我想檢查重複,這些是:城市,州,郵編,緯度,經度我試過其他方法,如這個find rows that multiple columns are identical using SQL query但它仍然給我錯誤,即使我改變了名稱,以匹配我的表和列。我的很多行的這個樣子SQL查詢如何刪除具有5列相同的行並在Postgres中保留1的行

  1. 芝加哥IL 41.881 -87.6245
  2. 芝加哥IL 60475 41.853 -87.6846
  3. 芝加哥IL 41.881 -87.6245
  4. 芝加哥IL 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; 
+0

因此,在你的示例中,你保留行1和2將是解決方案? –

+0

你通過+ count方法得到了哪些錯誤?和@JuanCarlosOropeza,我相信保持2,3,4(或1,2,4)將是解決方案,因爲1和3是相同的。 –

+0

@MattH是的,我只是有點迷惑。順便說一下,'group by'是簡單的部分,我猜OP需要刪除部分。我正在按分區做一個row_number,所以除了'row = 1'之外,全部刪除。 –

回答

4

在Postgres中,您可以使用ctid來實現此目的。這是一個你真的不應該使用的內置列。但是,如果你沒有一個表的主鍵,然後它是有用的:

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

這應該保留該行擁有最大ctid爲五列的每個組合。

+0

戈登,真是個野獸。總是爲勝利而來。爲什麼你不能讓像我這樣的小菜鳥回答?你知道嗎..給我們一些答案的人一個鏡頭? ;) –

+0

@MattH。 。 。我在回答前留下了* 20 *分鐘的問題;) –

+0

呃..我從來沒說過我很快!我的解決方案也不像您的解決方案那樣優雅。 +1。 :]總是喜歡從你的答案中學習。 –

相關問題