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 для поиска дубликатов.