Добавить в корзинуПозвонить
Найти в Дзене
SQL аналитика

Как найти и убрать дубли клиентов по телефону или почте в таблице Excel через SQL

```sql WITH CleanClients AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY phone ORDER BY client_id) as row_num FROM clients ) SELECT * FROM CleanClients WHERE row_num = 1; ``` Что делать: Функция ROW_NUMBER делит таблицу на группы по номеру телефона и присваивает каждой строке порядковый номер. Сортировка по client_id гарантирует, что останется самая ранняя запись клиента. Внешний запрос отфильтровывает все дубли, оставляя только строки с номером один. Как пользоваться: Скопируйте код в редактор SQL в Excel. Замените phone и client_id на реальные названия ваших столбцов. Запустите запрос и выгрузите результат на новый лист, чтобы сравнить с исходной таблицей перед окончательной заменой. ```sql WITH CleanClients AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY phone, email ORDER BY client_id) as row_num FROM clients ) SELECT * FROM CleanClients WHERE row_num = 1; ``` Что делать: Добавляет второе поле email в условие PARTITION BY. Теперь SQL будет считать строки дублями только при полном совпа
Оглавление

Блок кода 1. Поиск и удаление дублей по телефону

```sql
WITH CleanClients AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY phone ORDER BY client_id) as row_num
FROM clients
)
SELECT * FROM CleanClients WHERE row_num = 1;
```

Что делать: Функция ROW_NUMBER делит таблицу на группы по номеру телефона и присваивает каждой строке порядковый номер. Сортировка по client_id гарантирует, что останется самая ранняя запись клиента. Внешний запрос отфильтровывает все дубли, оставляя только строки с номером один.

Как пользоваться: Скопируйте код в редактор SQL в Excel. Замените phone и client_id на реальные названия ваших столбцов. Запустите запрос и выгрузите результат на новый лист, чтобы сравнить с исходной таблицей перед окончательной заменой.

Блок кода 2. Учет почты и телефона одновременно

```sql
WITH CleanClients AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY phone, email ORDER BY client_id) as row_num
FROM clients
)
SELECT * FROM CleanClients WHERE row_num = 1;
```

Что делать: Добавляет второе поле email в условие PARTITION BY. Теперь SQL будет считать строки дублями только при полном совпадении и телефона, и почты. Это защищает от случайного удаления разных клиентов, у которых может случайно совпасть один из контактов.

Как пользоваться: Используйте этот вариант, если в вашей базе часто бывают ситуации, когда у разных людей указан один корпоративный телефон или одна общая почта. Замените названия столбцов на ваши и запустите для более безопасной очистки.

Блок кода 3. Проверка количества строк до и после

```sql
SELECT
COUNT(*) as total_rows,
COUNT(DISTINCT phone) as unique_phones
FROM clients;
```

Что делать: Считает общее число строк в таблице и количество уникальных телефонов. Разница между этими двумя числами покажет точное количество дублей, которые должны быть удалены. Это базовая проверка, которая спасает от случайного удаления нужных клиентов.

Как пользоваться: Запустите этот запрос перед основным удалением. Запомните или запишите два полученных числа. После очистки базы запустите его снова и убедитесь, что общее число строк уменьшилось ровно на разницу, которую вы увидели в начале.