一开始,这只是和我的一个朋友开玩笑,但后来它变成了一个有趣的技术问题:), I+ t1 h8 s" F& d! }% ~: _
我有下stuff表: 3 s9 h) E( f3 S" N* qCREATE TABLE stuff( id serial PRIMARY KEY, volume integer NOT NULL DEFAULT 0, priority smallint NOT NULL DEFAULT 0,);这张表包含了我所有东西的记录,分别有数量和优先级(我需要多少)。) M4 M. d! [" w
我有一个指定体积的袋子,比如1000。我想从表中选择所有可以放在袋子里的东西,首先包装最重要的东西。$ u3 |. `( x( b7 R. |0 G
这似乎是窗口函数的使用,所以这是我想出的查询: 3 u& y( I7 v4 W9 i: J" q6 H% ~select s.*,sum(volume) OVER previous_rows as total from stuff s where total 但问题在于Postgres抱怨:; b) w. h# t$ K g8 c$ X
ERROR: column "total" does not existLINE 3: where total 如果我删除这个过滤器,我会正确计算总列,正确排序结果,但 所有 内容会被选中,这不是我想要的。5 B' G4 ]* C8 z6 N/ D2 z
那我该怎么办呢?如何只选择可以放在袋子里的物品?- C/ B2 q0 \8 K2 s, e% q
4 o: l1 d5 j" @) H/ i解决方案: ; ]- p8 _7 ^% w) d
我没有使用PostgreSQL。但我最好的猜测是使用内联视图。 5 @7 ]. w: _( ]$ }: S1 iSELECT a.*FROM SELECT s.*,sum(volume) OVER previous_rows AS total FROM stuff AS s WINDOW previous_rows AS ORDER BY priority desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) ORDER BY priority DESC) AS aWHERE a.total <