Использование оконных функций в операторе обновления - PullRequest
30 голосов
/ 05 декабря 2010

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

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

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

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

Спасибо.

1 Ответ

47 голосов
/ 05 декабря 2010

Ошибка от 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.Вот синтаксис для ОБНОВЛЕНИЕ (см. Необязательный из списка ).

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

...