2015-04-08 39 views
1

如何使用Activerecord或SQL在任何列中查找具有重複值的記錄?如何使用Active Record查找具有任何重複數據的記錄

SELECT leads.id, leads.name, leads.email, leads.created_at, array_agg(tn2.id) as ids 
FROM "leads" join leads tn2 
    on leads.name = tn2.name 
     or leads.cpf_cnpj = tn2.cpf_cnpj 
     or leads.email = tn2.email 
     or leads.phone -> 'cellphone' = tn2.phone -> 'cellphone' 
     or leads.phone -> 'residence' = tn2.phone -> 'residence' 
     or leads.phone -> 'commercial' = tn2.phone -> 'commercial' 
GROUP BY leads.id ORDER BY leads.created_at DESC 

使用array_agg我想從重複對象只有ID,但它給了我所有的記錄。 目前,我正在使用PostgreSQL。

+0

通過編碼。你有什麼嘗試? – dnuka

+0

@Dhanuka,編輯。 –

+0

您似乎錯過了'WHERE'子句中的這個重要條件:'leads.id <> tn2.id' –

回答

1

如何查找任何列中具有重複值的記錄?

SELECT l.id, l.name, l.email, l.created_at, array_agg(l2.id) AS ids 
FROM leads l 
WHERE EXISTS (
    SELECT 1 
    FROM leads 
    WHERE id <> l.id 
    AND (
      name = l.name  
    OR  cpf_cnpj = l.cpf_cnpj 
    OR  email = l.email 
    OR  phone->'cellphone' = l.phone->'cellphone' 
    OR  phone->'residence' = l.phone->'residence' 
    OR  phone->'commercial' = l.phone->'commercial' 
     ) 
    ); 

但似乎你想要的東西不同:

如何從幾個給定列中的至少一個具有相同值的行得到的ID爲每一行的陣列,最年輕的入門?

SELECT l.id, l.name, l.email, l.created_at 
    , array_agg(l2.id ORDER BY l2.created_at DESC NULL LAST) AS dupe_ids 
FROM leads l 
JOIN leads l2 ON l2.id <> l.id 
     AND (
       l2.name = l.name  
     OR  l2.cpf_cnpj = l.cpf_cnpj 
     OR  l2.email = l.email 
     OR  l2.phone->'cellphone' = l.phone->'cellphone' 
     OR  l2.phone->'residence' = l.phone->'residence' 
     OR  l2.phone->'commercial' = l.phone->'commercial' 
      ) 
GROUP BY l.id 
ORDER BY l.created_at DESC NULL LAST; 

假設id是主鍵。

相關問題