3

クエリを上位n個のウィンドウに制限する簡単な方法があるかどうか疑問に思っています。

つまり、私は次のようなものを持っていると言います

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ウィンドウのみです。

うまくいけば、それは理にかなっています。

4

1 に答える 1

1

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

クエリの結果として最初の100個の「ウィンドウ」を選択し、それらのウィンドウに該当するすべての行を返します。ウィンドウはそれによって分割されているので、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に結合してすべてを取得することです。それらのウィンドウの行。

全体として、これは非常に複雑なクエリです。

于 2012-03-20T20:39:45.533 に答える