2013-12-15 5 views
0

Как связать дубликаты записей в PostgreSQL? Я нашел их:Связать дубликаты записей в PostgreSQL

SELECT * FROM (
    SELECT id, import_id, name, 
    ROW_NUMBER() OVER(PARTITION BY address ORDER BY name asc) AS Row 
    FROM companies 
) dups 
where 
dups.Row > 1 ORDER BY dups.name; 

См пример кода и демо на http://sqlfiddle.com/#!15/af016/7/1

Я хочу добавить столбец в компании под названием linked_id, который будет установлен на import_id первого из каждого набора дублирующие записи.

+0

Возможно, было бы неплохо не использовать «Строка» в качестве псевдонима столбца. Это запутанно, и это также ключевое слово в некоторых контекстах. Кстати, вопросы, подобные этому, * намного легче ответить, если вы разместите некоторые данные/схему образца как 'CREATE TABLE' и' INSERT'. SQLFiddle.com может быть удобен для этого и имеет инструмент преобразования текста в sql. –

+0

«Строка» взята из примера, который я нашел по адресу http://stackoverflow.com/questions/14471179 – Circuitsoft

ответ

1

Try:

UPDATE companies c 
SET import_id = q.import_id 
FROM (
    SELECT id, 
    FIRST_VALUE(import_id) 
     OVER(PARTITION BY name, address ORDER BY name asc) AS import_id, 
    ROW_NUMBER() 
     OVER(PARTITION BY name, address ORDER BY name asc) AS Rn 
    FROM companies 
) q 
WHERE c.id = q.id AND q.rn > 1 
; 

Демо: http://sqlfiddle.com/#!15/af016/10

+0

Я нашел свой ответ так же, как вы разместили свой. Благодаря! – Circuitsoft

1

Это установит parent_id к import_id первой компании, чтобы соответствовать.

UPDATE companies 
SET parent_id=rs.parent_id FROM 
(SELECT id, first_value(import_id) 
OVER (PARTITION BY address ORDER BY name) as parent_id 
FROM companies 
) AS rs 
WHERE rs.id=companies.id; 
Смежные вопросы