Обновить таблицу с оконной функцией
У меня есть таблица в Redshift с дублированной строкой, которую я хочу удалить,
для этого я создал поданный идентификатор и хочу обновить его, чтобы удалить дублированные строки. Я пытаюсь выполнить этот запрос, но он не работает
update mr_usage
set id=row_number () over (partition by uid,date(ts),title order by ts)
Я получил следующую ошибку:
ОШИБКА: невозможно использовать функцию окна в ОБНОВЛЕНИИ
Я ищу способ обновить это поле
2 ответа
Решение
Другое возможное решение (без CTE) использует UPDATE .. FROM
синтаксис с подзапросом напрямую
UPDATE mr_usage
SET id = sub.new_id
FROM (
SELECT
id, ROW_NUMBER() OVER (PARTITION BY uid, date(ts), title ORDER BY ts) AS new_id
FROM
mr_usage
) sub
WHERE id = sub.id
Но это также доступно начиная с PostgreSQL 8.4.
Вы можете попробовать CTE для достижения этой цели, хотя такое ОБНОВЛЕНИЕ не удалит дубликаты строк.
WITH n AS (
SELECT
id AS current_id,
ROW_NUMBER() OVER (PARTITION BY uid, date(ts), title ORDER BY ts) AS new_id
FROM
mr_usage
)
UPDATE
mr_usage
SET
id = n.new_id
FROM
n
WHERE
mr_usage.id = n.current_id;