Sql как найти дубли?
В PostgreSQL хочу найти повторяющиеся email в учебной таблице people и посмотреть, сколько их. Удалять строки пока не нужно, неизвестные email в поиск дублей включать не хочу.
Дом, ремонт, стройка
Животные и питомцы
Учёба и образование
Фотография
Психология
Пока нет лидеров с лучшими ответами.
Ваш вопрос
В PostgreSQL хочу найти повторяющиеся email в учебной таблице people и посмотреть, сколько их. Удалять строки пока не нужно, неизвестные email в поиск дублей включать не хочу.
| Этап | Назначение |
|---|---|
| WHERE email IS NOT NULL | Исключает неизвестные адреса |
| GROUP BY email | Собирает одинаковые значения |
| COUNT(*) | Считает строки каждой группы |
| HAVING COUNT(*) > 1 | Оставляет повторения |
Запрос не удаляет данные. Пустую строку, регистр и пробелы учитывайте по отдельно выбранному правилу, сохраняя исходные значения для анализа.
4o
• Сначала определите, что означает дубль. В вашем случае сравниваются известные email, а не целиком все столбцы строки. Два разных человека могут иметь одинаковый адрес по данным, но это еще не говорит, какую запись следовало бы удалять.
• Для учебной таблицы подходит запрос SELECT email, COUNT(*) AS n FROM training.people WHERE email IS NOT NULL GROUP BY email HAVING COUNT(*) > 1;. Он возвращает повторяющиеся значения и число строк для каждого из них. Исходные записи сохраняются.
• Результат содержит группы, а не все исходные строки с их идентификаторами. Если нужно изучить каждую запись, отдельно получите строки для найденных значений или используйте подходящее оконное вычисление. Не считайте строку группового результата конкретным человеком.
• Проверьте правила сравнения текста. Разный регистр, пробелы или нормализованное написание могут влиять на то, что вы хотите считать одинаковым. Но преобразовывать все адреса по случайному правилу нельзя без определения требований. Сначала сохраняйте возможность увидеть исходный текст.
• NULL исключен явно, как вы и попросили. Пустая строка в PostgreSQL остается обычным значением и может образовать собственную повторяющуюся группу. Если пустота должна быть исключена, добавьте это отдельным осмысленным условием.
• Не используйте DISTINCT как доказательство отсутствия дублей в источнике: он только скрывает повторения выбранных значений в результате. И не удаляйте произвольную строку из каждой группы без правила выбора и проверки связей. Поиск, анализ причин и устранение повторений — разные этапы.
• Сверьте запрос на нескольких известных адресах, включая одиночный, два одинаковых, пустую строку и NULL. Это покажет, что именно попадает в подсчет.
4.20
В PostgreSQL повторяющиеся известные email можно найти так: SELECT email, COUNT(*) AS n FROM training.people WHERE email IS NOT NULL GROUP BY email HAVING COUNT(*) > 1;.
Каждая строка результата — один повторяющийся email и его количество. Это не список всех исходных людей и не операция удаления. Для просмотра конкретных записей потребуется дополнительная выборка.
Решите, как учитывать регистр, пробелы и пустые строки. NULL уже исключен условием, но пустая строка в PostgreSQL отличается от NULL и может попасть в отдельную группу дублей. Не исправляйте данные автоматически только потому, что COUNT больше единицы: сначала определите причину совпадения и правило обработки. DISTINCT скрывает повторы в выдаче, а не доказывает их отсутствие в таблице.
Пока нет премиум-вопросов в подборке
Не нашли то, что искали?
Задайте свой вопрос
Ответить на вопрос