当前位置: 首页 > 面试题库 >

在PostgreSQL中按窗口函数过滤结果

马才
2023-03-14
问题内容

好的,起初这只是和我的一个朋友开玩笑,但后来变成了有趣的技术问题:)

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

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

那么,我该怎么做呢?如何仅选择可以放入袋子的物品?


问题答案:

我没有使用PostgreSQL。但是,我最好的猜测是使用内联视图。

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;


 类似资料:
  • 问题内容: 这是该问题的后续内容,其中对我的查询进行了改进,使其使用窗口函数而不是联接内的聚合。虽然查询现在快得多,但我发现结果不正确。 我需要在x年尾随时间框架上执行计算。例如,每行的计算方法是:十年前移至当前行,然后除以结果。为了简单起见,我们将使用1年。 SQL Fiddle对此问题进行了解答。(Postgres 9.6) 作为一个简单的例子,和用于可像这样分别计算: 要做到这一点 ,每行

  • 我有以下数据: 现在我想以这样一种方式过滤数据,我可以删除第6行和第7行,对于特定的uid,我想在代码中只保留一行值为'c' 所以预期的数据应该是: 我使用的窗口函数如下所示:

  • 我有一个包含以下数据的pyspark dataframe:

  • 本文向大家介绍PostgreSQL数据库中窗口函数的语法与使用,包括了PostgreSQL数据库中窗口函数的语法与使用的使用技巧和注意事项,需要的朋友参考一下 什么是窗口函数? 一个窗口函数在一系列与当前行有某种关联的表行上执行一种计算。这与一个聚集函数所完成的计算有可比之处。但是窗口函数并不会使多行被聚集成一个单独的输出行,这与通常的非窗口聚集函数不同。取而代之,行保留它们独立的标识。在这些现象

  • 问题内容: 我有一个涉及Postgresql数据库的任务。我对SQL不太有经验。 我有一张桌子,上面有每周贸易产品的营业额。 对于每周,提供以下信息:产品,周数,每周营业额(可能是正数,也可能是负数,具体取决于天气是购买还是出售了更多产品)。我已经添加了一个列,每个星期都有期末余额。我在表中的第一周所有产品的期末余额(week_number= 0),而其他所有周均为“ null”。下面提供了一些示