SQL-запрос для сопоставления дублированных записей для обогащения данных

Я довольно новичок в PostgreSQL.

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

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

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

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 запрос. Затем оберните это как подзапрос в ОТ и отфильтруйте WHERE dup_num > 1, Этот подход позволяет найти только дубликаты строк, т.е. он исключает одну строку, которую он рассматривает как исходную строку. Для контроля, который рассматривается как дубликат, а который как оригинал, вы можете использовать ORDER BY пункт внутри OVER (...) окно.

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

Другие вопросы по тегам