わかりました、最初はこれは私の友人との単なる冗談でしたが、興味深い技術的な質問になりました :)
次のstuff
表があります。
CREATE TABLE stuff
(
id serial PRIMARY KEY,
volume integer NOT NULL DEFAULT 0,
priority smallint NOT NULL DEFAULT 0,
);
テーブルには、それぞれのボリュームと優先度 (必要な量) とともに、すべてのアイテムのレコードが含まれています。
指定された容量のバッグがあります1000
。バッグに入れることができるすべてのものをテーブルから選択し、最も重要なものを最初に詰めたい.
これはウィンドウ関数を使用する場合のように思われるので、私が思いついたクエリは次のとおりです。
select s.*, sum(volume) OVER previous_rows as total
from stuff s
where total < 1000
WINDOW previous_rows as
(ORDER BY priority desc ROWS between UNBOUNDED PRECEDING and CURRENT ROW)
order by priority desc
ただし、問題は、Postgres が不平を言うことです。
ERROR: column "total" does not exist
LINE 3: where total < 1000
このフィルターを削除すると、合計列が適切に計算され、結果が適切に並べ替えられますが、すべてのものが選択されます。これは私が望んでいるものではありません。
それで、どうすればいいですか?バッグに収まる商品だけを選ぶにはどうすればよいですか?