46

Django を介してアクセスする大きな PostgreSQL テーブルがあります。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() メソッドに渡すのは適切ではありません。これは、必要な .filter() などの追加の ORM 機能をサポートしていない RawQuerySet を返すためです。

ありがとう。

4

1 に答える 1

77

エラーはdjangoではなくpostgresからのものです。これを次のように書き換えることができます。

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の構文は次のとおりです(オプションのfromlistを参照してください)。

お役に立てれば。

于 2010-12-05T14:57:33.883 に答える