Подтвердить что ты не робот

Использование оконных функций в операторе обновления

У меня есть большая таблица PostgreSQL, через которую я обращаюсь через Django. Поскольку Django ORM не поддерживает функции окна, мне нужно испечь результаты оконной функции в таблице как обычный столбец. Я хочу сделать что-то вроде этого:

UPDATE  table_name
SET     col1 = ROW_NUMBER() OVER ( PARTITION BY col2 ORDER BY col3 );

Но я получаю ERROR: cannot use window function in UPDATE

Может ли кто-нибудь предложить альтернативный подход? Передача синтаксиса оконных функций с помощью метода Django.raw() не подходит, поскольку он возвращает RawQuerySet, который не поддерживает дополнительные функции ORM, такие как .filter(), которые мне нужны.

Спасибо.

4b9b3361

Ответ 1

Ошибка из postgres не django. Вы можете переписать это как:

WITH v_table_name AS
(
    SELECT row_number() over (partition by col2 order by col3) AS rn, primary_key
    FROM table_name
) 
UPDATE table_name set table_name.col1 = v_table_name.rn
FROM v_table_name
WHERE table_name.primary_key = v_table_name.primary_key;  

Или, альтернативно:

UPDATE table_name set table_name.col1 = v_table_name.rn
FROM  
(
    SELECT row_number() over (partition by col2 order by col3) AS rn, primary_key
    FROM table_name
) AS v_table_name
WHERE table_name.primary_key = v_table_name.primary_key;

Это работает. Просто протестировал его на postgres-9.6. Вот синтаксис UPDATE (см. Дополнительный список).

Надеюсь, что это поможет.