PostgreSQL 在 where 子句中使用 sum

Maj*_*ati 9 sql postgresql select sum

我有一个表,其中有一个名为“容量”的数字列。我想选择第一行,其容量总和不大于 X, Sth 就像这个查询

select * from table where sum(capacity )<X
Run Code Online (Sandbox Code Playgroud)

但我知道我不能where部分使用聚合函数。那么还有什么其他方法可以解决这个问题呢?

这是一些示例数据

id| capacity
1 | 12
2 | 13.5
3 | 15
Run Code Online (Sandbox Code Playgroud)

我想按照 id 的顺序列出总和小于 26 的行,所以像这样的查询

 select * from table where sum(capacity )<26 order by id
Run Code Online (Sandbox Code Playgroud)

它必须给我

id| capacity
1 | 12
2 | 13.5
Run Code Online (Sandbox Code Playgroud)

因为12+13.5<26

小智 10

聚会有点晚了,但为了将来的参考,以下内容应该适用于与OP类似的问题:

SELECT id, sum(capacity)
FROM table
GROUP BY id
HAVING sum(capacity) < 26
ORDER by id ASC;
Run Code Online (Sandbox Code Playgroud)

使用 PostgreSQL 文档来参考聚合函数:https://www.postgresql.org/docs/9.1/tutorial-agg.html


Fah*_*hik 5

使用Having条款

    select * from table order by id having sum(capacity)<X
Run Code Online (Sandbox Code Playgroud)

  • 我使用了这个,但它说'错误:列“id”必须出现在 GROUP BY 子句中或在聚合函数中使用位置:8' id 是其主键 (2认同)

Mur*_*nik 4

您可以使用 的窗口变体sum来生成累积和,然后在where子句中使用它。请注意,窗口函数不能直接放置在where子句中,因此您需要一个子查询:

SELECT   id, capacity
FROM     (SELECT id, capacity, SUM(capacity) OVER (ORDER BY id ASC) AS cum_sum
          FROM   mytable) t
WHERE    cum_sum < 26
ORDER BY id ASC;
Run Code Online (Sandbox Code Playgroud)

  • 不确定 cum sum 是最好的命名:P (3认同)