Używanie funkcji okna w instrukcji aktualizacji

Mam dużą tabelę PostgreSQL, do której uzyskuję Dostęp poprzez Django. Ponieważ ORM Django nie obsługuje funkcji okien, muszę upiec wyniki funkcji okien w tabeli jako zwykłą kolumnę. Chcę zrobić coś takiego:

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

Ale dostaję ERROR: cannot use window function in UPDATE

Czy ktoś może zaproponować alternatywne podejście? Przekazywanie składni funkcji okna przez Django .metoda raw() nie jest odpowiednia, ponieważ zwraca RawQuerySet, który nie obsługuje dalszego ORM funkcje takie jak .filter (), którego potrzebuję. Dzięki.
Author: SteveC, 2010-12-05

1 answers

Błąd pochodzi z postgres nie django. Możesz to przepisać jako:

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;  

Lub alternatywnie:

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;
To działa. Właśnie testowałem na postgres-9.6. Oto składnia UPDATE (Zobacz opcjonalny fromlist ). Mam nadzieję, że to pomoże.
 63
Author: Max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-15 20:10:48