2016-03-09 3 views
1

Таблица DDL:Как удалить повторяющиеся строки для 2 столбцов с помощью PostgreSQL?

CREATE TABLE entities_patents (
    entity_id INTEGER REFERENCES entities(entity_id) NOT NULL, 
    patent_id INTEGER REFERENCES patents (patent_id) NOT NULL, 
    doc_number text NOT NULL, 
    created_at timestamp with time zone DEFAULT current_timestamp, 
    updated_at timestamp with time zone DEFAULT current_timestamp, 
    deleted boolean, 
    PRIMARY KEY (entity_id, patent_id) 
); 

К сожалению, есть дубликаты в таблице, и я не мог добавить рк ограничение ранее. Попытка сделать это теперь приводит к:

DETAIL: Key (entity_id, patent_id)=(123123, 811231333) is duplicated. 

Есть ли способ удалить эти дубликаты?

ответ

1

Вы можете использовать ROW_NUMBER(), так что попробуйте это: (непроверенные это может иметь некоторые проблемы синтаксиса)

DELETE FROM entities_patents t 
WHERE EXISTS(SELECT * FROM (
        SELECT p.entity_id,p.patent_id,p.created_at,p.updated_at, 
        ROW_NUMBER() OVER(PARTITION BY p.entity_id,p.patent_id ORDER BY p.created_at DESC,p.updated_at DESC) as rnk 
        FROM entities_patents p) s 
       WHERE s.rnk > 1 and s.entity_id = t.entity_id and s.patent_id = t.patent_id 
        AND s.created_at = t.created_at and s.updated_at = t.updated_at) 
1
WITH CTE AS 
    (SELECT *,ROW_NUMBER() OVER(PARTITION by entity_id, patent_id 
           ORDER BY created_at) AS rn 
    FROM entities_patents) 
DELETE 
FROM entities_patents 
WHERE (entity_id,patent_id) IN (SELECT entity_id,patent_id FROM CTE WHERE rn >1) 
1

Другой метод с использованием group by и count

DELETE 
FROM entities_patents B 
USING (
     select entity_id, patent_id 
     from entities_patents 
     group by entity_id, patent_id 
     having count(*) > 1 
) C 
WHERE B.entity_id = C.entity_id AND 
     B.patent_id = C.patent_id 
Смежные вопросы