postgresql 动态添加过滤条件,在PostgreSQL中按窗口函数过滤结果

Ok, initially this was just a joke we had with a friend of mine, but it turned into interesting technical question :)

I have the following stuff table:

CREATE TABLE stuff

(

id serial PRIMARY KEY,

volume integer NOT NULL DEFAULT 0,

priority smallint NOT NULL DEFAULT 0,

);

The table contains the records for all of my stuff, with respective volume and priority (how much I need it).

I have a bag with specified volume, say 1000. I want to select from the table all stuff I can put into a bag, packing the most important stuff first.

This seems like the case for using window functions, so here is the query I came up with:

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

The problem with it, however, is that Postgres complains:

ERROR: column "total" does not exist

LINE 3: where total < 1000

If I remove this filter, total column gets properly calculated, results properly sorted but all stuff gets selected, which is not what I want.

So, how do I do this? How do I select only items that can fit into the bag?

解决方案

I haven't worked with PostgreSQL. However, my best guess would be using an inline view.

SELECT 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 a

WHERE a.total < 1000;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值