2014-11-03 1 views
0

Я довольно новичок в PostgreSQL.SQL-запрос для сопоставления дублированных записей для обогащения данных

Я планирую запустить набор данных продуктов через механический турк, чтобы обогатить данные информацией о ценах. Проблема в том, что у меня есть 80 000 записей, загруженных пользователями, многие из которых находятся в действительных дубликатах, хотя у них могут быть другие параметры, которые не дублируются.

Если я обогащаю данные из запроса SELECT DISTINCT, проблема в том, что у меня не будет способа добавить эти данные к фактическим «дублирующимся» записям.

Как я могу увидеть все строки, исключенные из запроса SELECT DISTINCT, чтобы я мог вернуться и обогатить эти строки моими новыми данными позже?

+0

'что у меня есть 80 000 записей, загружаемых пользователями, многие из которых дублируются в действительности, хотя у них могут быть другие параметры, которые не дублируются.« Пожалуйста, узнайте о моделировании данных. То, что вы сохранили в одной таблице, вероятно, должно быть нормировано на две, три или более таблицы. – wildplasser

+0

@wildplasser Я подозреваю, что это грязные данные, которые очищаются и нормализуются, но требуют очистки рук. –

+0

Да, грязные данные, которые убираются. Спасибо за вашу помощь. –

ответ

1

Вместо того, чтобы использовать DISTINCT, вы должны GROUP BY поля, которые вы хотите рассматривать как указывающие на дубликат.

Тогда у вас есть несколько вариантов:

  • array_agg не-сгруппированных по строкам;

  • Задайте запрос GROUP BY ... HAVING count(...) > 1 в подзапросе, который вы используете в предложении FROM, затем выполните самосоединение в исходной таблице в тех же столбцах, что и вы сгруппированы. Это позволит вам найти все строки с дубликатами.

  • Используйте функцию окна для row_number() OVER (PARTITION BY col1, col2, col3) as dup_num, где col1, col2, col3 - это коды, которые у вас есть в запросе DISTINCT. Затем заверните это как подзапрос-в-FROM и фильтр для WHERE dup_num > 1. Этот подход позволяет найти только строки duplicate, то есть исключает одну строку, которую он рассматривает как исходную строку. Для контроля, который обрабатывается как дубликат, и который в качестве оригинала вы можете использовать предложение ORDER BY внутри окна OVER (...).

Я уверен, что есть много примеров того, как найти и вернуть дубликаты. Я предлагаю искать переполнение стека под тегом для запросов, чтобы найти дубликаты.

+0

Использование array_agg оказалось эффективным. Теперь у меня есть карта между уникальными экземплярами каждого продукта, и все это дубликаты. –