Оставьте строку с минимальным id для каждого value, а остальные удалите по рангу внутри группы. Перед удалением проверьте выборку и выполняйте операцию в контролируемой транзакции.
Функция очистки таблицы от повторяющихся значений в колонке value
Оставьте строку с минимальным id для каждого value, а остальные удалите по рангу внутри группы. Перед удалением проверьте выборку и выполняйте операцию в контролируемой транзакции.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В базе имеется таблица с двумя столбцами: id – автоинкрементный уникальный идентификатор и value – числовое поле, в котором могут встречаться одинаковые числа. Требуется реализовать функцию, которая удалит все дублирующиеся записи, оставив только одну строку для каждого уникального значения value.
Пример исходных данных:
T id | value
1 | 1 2 | 2 3 | 2 4 | 3 5 | 3 6 | 3
Ответ
Оставьте строку с минимальным id для каждого value, а остальные удалите по рангу внутри группы. Перед удалением проверьте выборку и выполняйте операцию в контролируемой транзакции.
Пример для PostgreSQL:
WITH ranked AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY value ORDER BY id) AS rn
FROM T
)
DELETE FROM T
USING ranked r
WHERE T.id = r.id AND r.rn > 1;
В примере останутся id 1, 2, 4. Перед DELETE тот же CTE можно использовать с SELECT для проверки. Параллельные записи требуют согласованной блокировки или миграционного режима, после очистки — уникального ограничения с нужной семантикой NULL. Для большой таблицы полезно удалять ограниченными партиями.