2010-12-05 13 views
19

私は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を返します。

ありがとうございました。

答えて

34

エラーは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を参照)。

これが役に立ちます。

+0

自己結合が必要ないと思いますか?私は間違っているかもしれませんが、私はこれをSQL Serverで動作するものに基づいています! –

+0

@Martin:2つのテーブルを選択しています.1つはUPDATE 'tablename'で、もう1つは' FROM tablename'節にあります。あなたが明示的に参加しなければ、それはデカルト積を生み出すでしょう。 – Max

+0

ああ、いいえ、私はありません! –

関連する問題