Postgres中over子句内的where子句

16

以下是否可以在 overclause 中使用 where 子句?

SELECT SUM(amount) OVER(partition by prod_name WHERE dateval > dateval_13week)

由于我的日期不按顺序排列,所以我无法在over子句中使用preceding和following。我只需要提取少于当前记录的13周日期值的记录。

EDIT : 
sum(CASE WHEN dateval >= dateval_13week and dateval <=current_row_dateval then amount else 0 end) over (partition by prod_name order by week_end desc)

更详细地说,早先当我的日期都是按顺序排列的时候,我使用以下查询来分区记录。现在我的日期是随机排列的,且有一些日期缺失。

sum(amount) over 
        (partition by prod_name order by prod_name,week_end desc rows between 0 preceding and 12 following)
3个回答

21

除了@D Stanley的答案以外,您还可以在Postgre的聚合函数中使用FILTER子句:

SELECT SUM(amount) FILTER (WHERE dateval > dateval_13week)
           OVER(partition by prod_name)

10
你可以在SUM参数中模拟WHERE
SELECT SUM(CASE WHEN dateval > dateval_13week THEN amount ELSE 0 END) 
           OVER(partition by prod_name)

1
@D Stanley。您能帮我检查一下我的修改吗?我想要计算所有位于当前行日期和其前13周日期之间的条目之和,而不仅仅是与其13周值进行比较。我的当前行日期值是提取条目的参考值。 - user2569524

1

您不能使用WHERE子句在OVER分区子句中过滤行。您可以使用CASE修复查询,仅选择需要的行,并在满足条件时执行金额总和。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接