2016-11-14 9 views
2

2つの列(つまり、「address_token」という一意の識別子と「list_date」と呼ばれる日付フィールド)によって定義されたウィンドウに対して、列A(「original_list_price」)の最大値を取得しようとしています。私。同じaddress_tokenとlist_dateの両方を持つ行のmax "original_list_price"について知りたいです。Postgresqlの書き込みmax()複数のパーティション式を持つウィンドウ関数?

例えば:

SELECT 
address_token, list_date, original_list_price, 
max(original_list_price) OVER (PARTITION BY address_token, list_date) as max_list_price 
FROM table1 

私が(例えば、それだけで後は何もaddress_token使用していない)PARTITIONでちょうど1式を使用する場合、クエリが既に> 10分かかります。クエリがタイムアウトすることがあります。 (私はモード分析を使用し、このエラーが発生します:バックエンドに送信中にI/Oエラーが発生しました)質問:

1)Window関数は複数のPARTITION BY式で機能しますか?

2)希望の結果を得るための他の方法はありますか?

3)Windowsの機能を実現する方法、特にパーティション部分の実行速度が向上していますか?例えば他のデータ型よりも特定のデータ型を使用する場合は、長い英数字の文字列識別子を使用しないでください。

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

+0

グループ化セット/ with-rollupを探しているのだろうか –

答えて

1

ウィンドウ関数分割句の複雑さは、パフォーマンスに大きな影響を与えるべきではありません。あなたのクエリがすべてのテーブルの行を返すので、非常に大きな結果セットがあるかもしれません。

インデックスの機能を利用できるはずです。このクエリの場合:

SELECT address_token, list_date, original_list_price, 
     max(original_list_price) OVER (PARTITION BY address_token, list_date) as max_list_price 
FROM table1; 

インデックスをtable1(address_token, list_date, original_list_price)に設定します。それは値を返す前に(すべての行に対して)最初のウィンドウ関数値を計算する必要がないので、これは、より迅速に結果を返す必要があります

select t1.*, 
     (select max(t2.original_list_price) 
     from table1 t2 
     where t2.address_token = t1.address_token and t2.list_date = t1.list_date 
     ) as max_list_price 
from table1 t1; 

あなたはとしてクエリを書いてみてください。

+0

サブクエリからインスピレーションを得て、私は今、データを(original_list_price descの順序で)並べ替えるサブクエリを作成しようとしています。各グループの値(address_tokenとlist_dateによるグループ化)は、目的の行(つまり、address_tokenとlist_dateの組み合わせの最大original_list_price)になります。 フォローアップの質問:別のサブクエリでグループのトップ値のみを使用する方法があることを覚えていますか?別のものを選択してください。 @LauraD。 –

+0

。 。新しい質問はコメントではなく質問として尋ねられるべきです。あなたがグループのトップバリューを探しているのなら別の質問をしてください。なぜなら、それはこの質問が尋ねるものではないからです(この答えを無効にする可能性があるので、この質問を変えるのは失礼です。 –