【问题标题】:PostgreSQL - WHERE clause within OVER clause?PostgreSQL - OVER 子句中的 WHERE 子句?
【发布时间】:2011-06-20 22:31:31
【问题描述】:

我需要在 over 子句中使用 where 子句。怎么样?

SELECT SUM(amount) OVER(WHERE dateval > 12)

或者类似的东西。

--编辑--

更多细节

我的表格格式为年、月和金额列。

我想选择所有年、月和金额行并创建第四个“虚拟列”,其中包含金额列过去 12 个月的总和。

例如:

年份 |月 |数量
2001 | 03 | 10
2001 | 05 | 25
2001 | 07 | 10

应该创建:

年份 |月 |数量 |连续 12 个月
2001 | 03 | 10 | 10
2001 | 05 | 25 | 35
2001 | 07 | 10 | 45

【问题讨论】:

  • 您能否更准确地说明您需要什么?
  • 当然。例如,我想获得某个列的值小于 12 的行的总和。我不能使用通常的 WHERE 子句,因为我在同一个查询中收集了一些其他的东西。所以我需要类似 WHERE 子句的东西,但在 OVER 子句中。
  • 好的-感谢您提供的附加信息-这看起来更像是适合窗口功能。您使用的是哪个版本的 PostgreSQL?
  • 我已经编辑了我的原始答案,以窗口方式处理请求。

标签: postgresql


【解决方案1】:

给定一个针对您的三列结果集的查询,以下内容对您有用吗?

SELECT
    SUM(amount) OVER(ORDER BY YEAR ASC, MONTH ASC
                     ROWS BETWEEN 11 PRECEDING AND CURRENT ROW)
...

【讨论】:

  • 这是一个聚合函数,它不起作用 - 让我用更多细节更新 OP。
  • 我想我们需要知道你为这个聚合“分区”的是什么——如果有的话。
  • 我的荣幸。我期待 SQL Server 的下一个版本,所以我可以自己使用它! :)
  • @WillA 只是想知道。如果日期不按顺序排列怎么办。说在 12 个月的时间里是否有一些缺失的月份。那么我们如何按月分组。因为前面的 11 也可能需要其他年份的日期。
  • @user2569524 老问题,但你只需要使用 PARTITION BY。像OVER(PARTITION BY YEAR ORDER BY MONTH ASC ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) 这样的东西。不再需要按年订购,因为每个分区只有一年。最好说UNBOUNDED PRECEDING,因为它应该停在分区边界。
【解决方案2】:
select a,(select sum(a) from foo fa where fa.a > fb.a) from foo fb;

不使用 over,效率很低,因为它为每个查询运行新的子查询,但它可以工作。

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2018-02-06
    • 1970-01-01
    • 2013-02-28
    • 2020-04-28
    • 2016-11-21
    相关资源
    最近更新 更多