В PostgreSQL можно различить физические версии строк через ctid и удалить лишние по ROW_NUMBER. Для значений 1, 1, 2 останутся 1 и 2.
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.
Для обычной, не секционированной таблицы 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.