2012-03-20 12 views
2

クエリを上限のn個のウィンドウに限定する簡単な方法があるのだろうかと思います。PostgreSQL LIMIT over WINDOW

つまり、私は

SELECT field1 
     ,field2 
     ,field3 
     ,sum(field2) over (partition by field1) sum2 
     ,sum(field3) over (partition by field1) sum3 
FROM table1 
GROUP BY field1, field2, field3 
ORDER BY sum2 DESC LIMIT 100 
のようなもの

上記のクエリは、私が取得したいどのようなトップ100を記録、ない(意味があります)上位100の窓

を返しますが、トップ100 SUM2である持っていると言いますそのウィンドウの中に複数の行があるかもしれません。だから私は400のレコードを取得するかもしれないが、トップ100のウィンドウだけ。

うまくいけばうまくいきます。

+0

なぜ列でグループ化していませんか? – Teja

+0

残すためには、各レコードの詳細が必要です。私は同じ結果セット内の詳細と集約を取得しようとしています。実際のクエリははるかに大きいです。これは単なる質問のサンプルでした。 –

+0

まだまだ...しかし、最初に列でグループ化する必要があります... – Teja

答えて

1

コメントの後にもう少し考えてみると、次のクエリはあなたが望むことをすると思います。

私はクエリの結果として最初の100 "windows"を選択し、それらのウィンドウに入るすべての行を返します。ウィンドウはfield1で区切られており、実際にはfield1の100個の異なる値が最大でsum2です。結束がsum2の場合、より大きなfield1が私のクエリで勝ちます(あなたは指定しませんでした)。

WITH x AS (
    SELECT field1 
      ,field2 
      ,field3 
      ,sum(field2) over w sum2 
      ,sum(field3) over w sum3 
    FROM table1 
    GROUP BY field1, field2, field3 
    WINDOW w AS (PARTITION BY field1) 
    ) 
    , y AS (
    SELECT field1 
    FROM x 
    GROUP BY sum2, field1 
    ORDER BY sum2 DESC, field1 DESC 
    LIMIT 100 
    ) 
SELECT x.* 
FROM y 
JOIN x USING (field1) 
ORDER BY sum2 DESC, field1 DESC, field2 DESC, field3 DESC; 

重要なポイントは、CTEでの集計値を生成することで、別のCTEのもののうち、100の勝利の窓を選ぶ(DISTINCTでもを行うことができる、私はGROUP BY/ORDER BYを選んだ)、および参加結果を最初のCTEに戻して、それらのウィンドウのすべての行を取得します。

これはすべてかなり複雑なクエリです。

+0

クイック返信ありがとうございます。私は関係なく100行を得ているようだ。私は私が何を明確に説明したとは思わない。私が探していたのは、グループ内の各レコードでした。だから私は、そのウィンドウ内の各レコードでトップ100のウィンドウを取得します。したがって、各ウィンドウ内に5つのレコードがあって、100個のウィンドウが欲しければ、合計500個のレコードで終了します。 –

+0

@PhilFreeman:効果的に、(field2、field3)のすべての組み合わせに対して行を持つ 'field1'の100個の異なる値が必要ですか?そして、あなたは 'GROUP BY field1、field2、field3'をしたいと思っていますか?それ以前に重複を取り除いています - 重複は合計に加算されませんか?あなたのような複雑なケースでは、いくつかのサンプル値と予想されるサンプル出力で、コミュニケーションがより簡単になります。 –

+0

@PhilFreeman:もう一度試しました。 –