【问题标题】:PostgreSQL using sum in where clausePostgreSQL 在 where 子句中使用 sum
【发布时间】:2017-05-20 13:55:20
【问题描述】:

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

select * from table where sum(capacity )<X

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

这是一些示例数据

id| capacity
1 | 12
2 | 13.5
3 | 15

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

 select * from table where sum(capacity )<26 order by id

它必须给我

id| capacity
1 | 12
2 | 13.5

因为 12+13.5

【问题讨论】:

  • 帮助我们帮助您 - 请分享一些示例数据以及您希望为此示例获得的结果。
  • 试试having子句
  • @Mureinik 我添加了一些示例数据。谢谢
  • 我对你在这里想要什么有点困惑,但这是我最好的猜测:你想从表中按 id 列的顺序选择行,在你去和停止时总结容量在总和达到 26 之前选择?
  • @DavidBachmannJeppesen 是的,这正是我想要的,似乎 Mureinik 的答案就是解决方案

标签: sql postgresql select sum


【解决方案1】:

使用Having 子句

    select * from table order by id having sum(capacity)<X

【讨论】:

  • 我用过这个,但它说'错误:列“id”必须出现在 GROUP BY 子句中或用于聚合函数位置:8' id 是它的初级键
  • 查看编辑。当我写答案时,你只提供了第一个 sn-p。所以,在你编辑之后,我也修改了答案
  • 我不知道为什么你的回答又给了我这个错误,但 Mureiniks 的回答没有
【解决方案2】:

您可以使用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;

【讨论】:

  • 第一次选择的容量不应该是cum_sum?
  • @MajidHojati 在您在问题中提供的示例中,您希望显示每行的容量,而不是累积容量,这就是我在选择列表中输入的内容。当然,您可以添加 cum_sum 或替换 capacity - 这完全取决于您要显示的结果。
  • 不确定 cum sum 是不是最好的命名方式:P
【解决方案3】:

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

SELECT id, sum(capacity)
FROM table
GROUP BY id
HAVING sum(capacity) < 26
ORDER by id ASC;

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

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多