2015-02-21 3 views
0

У меня есть столовая компания с 60 колонками. Цель состоит в том, чтобы создать инструмент для поиска, сравнения и устранения дубликатов в этой таблице.Найти равные записи двойной записи postgresql

Пример: У меня есть запись с идентификатором 22 и я знаю, он имеет двойника, потому что я бегу это (упрощенный код):

SELECT min(co_id),co_name,count(*) FROM co 
GROUP BY co_name 
HAVING count(*) > 1 

Результат показывает, есть одна двойная (кол-2), и я получаю самый старый идентификатор по min (co_id)

Мой вопрос в том, как я ищу двойную co_id? Просто передайте самый старый идентификатор?

Что-то вроде:

SELECT co_id FROM co 
WHERE co_name EQUAL TO co_id='22' 
LIMIT 2 

Образец данных:

id co_name 
22 Volvo 
23 Volvo 
24 Ford 
25 Ford 

Я знаю ИН 22, и я хочу найти близнецов 23 на основе содержания 22.

Ближайший Я нашел это. Это далеко не общее. И кошмар для сравнения 60:

SELECT id, 
(SELECT max(b.id) from co b 
WHERE a.co_name = b.co_name 
LIMIT 1) as twin 
FROM co a 
WHERE id='22' 

Как сделать это более простым и общим способом? Мне просто нужна двойная запись co_id.

Спасибо заранее!

ответ

0

Я нашел одно решение, которое работает на 60 столбцов если я e вместо жесткого кода в запросе. Спасибо всем за вход. Некоторые из них были примерно одного трека.

SELECT id, 
(SELECT max(b.id) from co b 
WHERE concat(a.co_name,etc) = concat(b.co_name,etc) 
LIMIT 1) as twin 
FROM co a 
WHERE id='22' 

Не самый лучший, но принесите один близнец за один раз. И это далеко не общее. Спасибо, что указал мне в правильном направлении. Общее решение было бы лучше.

0

выберите max_co, co_name из ( выбрать максимум (co_id) max_co, мин (co_id) min_co, co_name от совместного группы по co_name, имеющей COUNT (*)> 1), где min_co = (старый со идентификатор в качестве входных данных) ;

+0

Извините. Я не получил этого, чтобы работать. – sibert

0

Вы можете присоединиться к таблице с собой:

SELECT c1.* 
FROM 
    co_name c1 INNER JOIN co_name c2 
    ON c1.co_name=c2.co_name 
    AND c1.id>c2.id 

это вернет все дублирующих записей (но не оригинал записи с наименьшим идентификатором). Или так как вы используете Postgresql вы можете использовать функцию окна:

SELECT * 
FROM (
    SELECT 
    id, 
    co_name, 
    row_number() OVER (PARTITION by co_name ORDER BY id) as row 
    FROM 
    co_name 
) s 
WHERE 
    row>1; 

Пожалуйста, смотрите пример here.

Если вы хотите сравнить несколько столбцов, решение JOIN будет более гибким. Я не знаю, как именно вы хотите, чтобы сравнить свои столбцы и как точно определить, «близнецы» строк, но запрос, как это должно помочь:

SELECT c1.* 
FROM 
    co_name c1 INNER JOIN co_name c2 
    ON (
     c1.co_name=c2.co_name 
     OR c1.co_city=c2.co_city 
     OR c1.co_owner=c2.co_owner 
     OR ... 
    ) AND c1.id>c2.id 

, если вы просто хотите, дублированные записи ид = 22, то вы можете попробовать это:

SELECT c1.* 
FROM 
    co_name c1 INNER JOIN co_name c2 
    ON c1.co_name=c2.co_name 
    AND c1.id>c2.id 
WHERE 
    c2.id=22 

или если вы просто хотите, один близнец, сравнивая 60 столбцов, вы можете попробовать с этим запросом:

SELECT MIN(ID) as Twin /* or MAX(ID), depending what you're after */ 
FROM 
    co_name c1 INNER JOIN co_name c2 
    ON (
     c1.co_name=c2.co_name 
     OR c1.co_city=c2.co_city 
     OR c1.co_owner=c2.co_owner 
     OR ... 
    ) AND c1.id>c2.id 
WHERE 
    c2.id=22 
+0

Извините. Оба запроса дают ВСЕ близнецы. Не только желаемый идентификатор 23. – sibert

+0

@sibert они вернут оба 23 и 25, не так ли, что вы ищете? – fthiella

+0

Только идентификатор, который соответствует 22 = близнец 23. – sibert

Смежные вопросы