gpt4 book ai didi

sql - 在 Postgresql 中按窗口函数结果过滤

转载 作者:行者123 更新时间:2023-11-29 11:08:54 24 4
gpt4 key购买 nike

好吧,最初这只是我们和我 friend 的一个玩笑,但它变成了一个有趣的技术问题:)

我有以下 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

如果我删除此过滤器,总计列将得到正确计算,结果将得到正确排序,但所有内容都会被选中,这不是我想要的。

那么,我该怎么做呢?如何只选择可以放入包中的元素?

最佳答案

我不知道这是否符合“更优雅”的条件,但它的编写方式与 Cyber​​nate 的解决方案不同(尽管本质上是相同的)

WITH window_table AS (    SELECT s.*,           sum(volume) OVER previous_rows as total   FROM stuff s   WINDOW previous_rows as         (ORDER BY priority desc ROWS between UNBOUNDED PRECEDING and CURRENT ROW)) SELECT * FROM window_tableWHERE total < 1000ORDER BY priority DESC 

如果“更优雅”是指避免子选择的东西,那么答案是“否”

关于sql - 在 Postgresql 中按窗口函数结果过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5042525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com