2017-11-26 9 views
1

この集計された値が望ましいしきい値を満たすまで、列の値を集約しながら順序付けされた表から行を取り出すクエリを作成したいと思います。PostgreSQL:1つの列の合計削減がしきい値を超えるまで行を選択

しきい値を超える違反行をクエリ結果に含める必要があるという追加基準があります。

私は、次のクエリを作成するに私をリードし、PostgreSQLの中で行われ、他のソリューションを探しています:

SELECT * FROM (
    SELECT *, SUM(amount) OVER (ORDER BY amount DESC) AS running_amount 
    FROM public.orders WHERE price = 0.09) AS t 
WHERE t.running_amount <= 15; 

このクエリでの問題は、しかし、それはの凝集をスキップPostgreSQLのウィンドウのクエリを、表していることです指定された行の列の値が一意でない場合は、すべての行に対して列の値を返します。

ウィンドウクエリは残念ながら、別個の値の列の考慮を考慮していません。

このようなアグリゲーションクエリをどこから始めるべきかはわかりませんが、これを可能にするために私が聞いたいくつかの選択肢は、PostgreSQL関数を作成することです。

誰かがアイデアやノウハウを持っているなら、私は非常に感謝します。

答えて

1

例えば、ウィンドウ関数のORDER BY句に一意の列(主キー)を追加します:あなたがシステム列ctid.


を使用することができるユニークなコラムの欠如で

SELECT * FROM (
    SELECT *, SUM(amount) OVER (ORDER BY amount DESC, id) AS running_amount 
    FROM public.orders WHERE price = 0.09 
) AS t 
WHERE t.running_amount <= 15; 

UNION ALLを使用して、しきい値を超える違反行を取得できます。例:

WITH cte AS (
    SELECT *, SUM(amount) OVER (ORDER BY amount DESC, id) AS running_amount 
    FROM public.orders 
    WHERE price = 0.09 
) 
SELECT * 
FROM cte 
WHERE running_amount <= 15 
UNION ALL (
    SELECT * 
    FROM cte 
    WHERE running_amount > 15 
    LIMIT 1 
); 
+0

どうもありがとう!これは、ウィンドウを動作させるための1つの問題を解決しました。しきい値を超えて違反行を取得するのはどうですか? – Dranithix

+0

更新された回答を参照してください。 – klin

+0

完璧に動作します!ありがとうhahah :)。 – Dranithix

1

最後の行(しきい値と交差する行)が必要な場合は、比較的単純な2つの選択肢があります。私の好みは次のとおりです。

SELECT o.* 
FROM (SELECT o.*, 
      SUM(amount) OVER (ORDER BY amount DESC) AS running_amount 
     FROM public.orders 
     WHERE price = 0.09 
    ) o 
WHERE o.running_amount - o.amount <= 15; 

代替は、ウィンドウ句です:

SELECT o.* 
FROM (SELECT o.*, 
      SUM(amount) OVER (ORDER BY amount DESC 
           ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING 
          ) AS running_amount 
     FROM public.orders 
     WHERE price = 0.09 
    ) o 
WHERE o.running_amount <= 15; 
+0

最初のクエリをWHERE o.running_amount - o.amount <= 15;に置き換えます。私が作ったすべてのテストケースで実際に動作します!あなたの最初のクエリが最良の答えである理由についての私の観察を説明する答えを出します。 – Dranithix

関連する問題