回答

收藏

在PostgreSQL按窗口函数过滤结果

技术问答 技术问答 229 人阅读 | 0 人回复 | 2023-09-14

一开始,这只是和我的一个朋友开玩笑,但后来它变成了一个有趣的技术问题:), 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 <
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则