LeetCode #? — В PostgreSQL есть таблица [таблица] с единственным столбцом id и значениями 1, 1, 2. Напишите DELETE-запрос, который физически удалит один дубликат.

В PostgreSQL можно различить физические версии строк через ctid и удалить лишние по ROW_NUMBER. Для значений 1, 1, 2 останутся 1 и 2.

Короткий ответ

Что ответить на собеседовании

В PostgreSQL можно различить физические версии строк через ctid и удалить лишние по ROW_NUMBER. Для значений 1, 1, 2 останутся 1 и 2.

Подробный разбор

Ответ с пояснениями

В PostgreSQL можно различить физические версии строк через ctid и удалить лишние по ROW_NUMBER. Для значений 1, 1, 2 останутся 1 и 2.

Для обычной, не секционированной таблицы t:

WITH duplicates AS (
    SELECT ctid,
           ROW_NUMBER() OVER (PARTITION BY id ORDER BY ctid) AS rn
    FROM t
)
DELETE FROM t
USING duplicates d
WHERE t.ctid = d.ctid AND d.rn > 1;

ctid — физический адрес версии строки, а не устойчивый идентификатор: не сохраняйте его для дальнейших операций. В этой задаче удаляется ровно одна строка; для произвольного набора удалятся все лишние копии каждого id. Предварительно проверьте выборку, а очистку и добавление ограничения уникальности согласуйте с конкурентными записями.

Источник: www.postgresql.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее