私はこのテーブルを持っています
ID値ユーザーストック --|--------|---------|--------- 1 | 10 | マーク | AAPL 2 | 20 | 奪う | グーグ 3 | 30 | マーク | AAPL 4 | -40 | マーク | AAPL 5 | -10 | 奪う | グーグ 6 | 25 | マーク | グーグ 7 | 5 | マーク | グーグ 8 | 45 | マーク | AAPL
以下に示す行を返すクエリを (おそらく PGSQL 関数を使用せずに) 作成したいと思います。ユーザー、株式でグループ化された「値」列を合計する順序 (ID ASC) で開始する必要があります。一時的な合計が 0 の場合、(そのグループの) 前の行はすべて破棄されます。
id値ユーザーストック --|--------|---------|--------- 2 | 20 | 奪う | グーグ 5 | -10 | 奪う | グーグ 6 | 25 | マーク | グーグ 7 | 5 | マーク | グーグ 8 | 45 | マーク | AAPL
OVER(PARTITION BY)やWINDOW関数を使えばいいと思います
SELECT *, SUM(value) OVER w AS scm
FROM "mytable"
WINDOW w AS (PARTITION BY user,stock ORDER BY id ASC)
これは次のテーブルを返します
ID値ユーザーストックscm ----|--------|---------|---------|------- 1 | 10 | マーク | AAPL | AAPL | 10 2 | 20 | 奪う | グーグ | 20 3 | 30 | マーク | AAPL | AAPL | 40 4 | -40 | マーク | AAPL | AAPL | 0 5 | -10 | 奪う | グーグ | 10 6 | 25 | マーク | グーグ | 25 7 | 5 | マーク | グーグ | 30 8 | 45 | マーク | AAPL | AAPL | 45
これは、マークの APPL が 0 (id=4) であり、そのグループ (AAPL,mark) の次のすべての行を保持する必要があることを示しているため、良い出発点になるはずです。ルールは次のとおりです。各グループ (在庫、ユーザー) について、scm=0 の最後の行に続くすべての行を保持します。