聚合窗口中的过滤器子句未按预期丢弃行

Posted

技术标签:

【中文标题】聚合窗口中的过滤器子句未按预期丢弃行【英文标题】:Filter clause in aggregate window not discarding rows as expected 【发布时间】:2016-06-15 15:56:53 【问题描述】:

我希望 filter 子句在将行传递给窗口函数之前丢弃行。来自docs:

如果指定了 FILTER,则只有 filter_clause 计算结果为 true 的输入行被馈送到窗口函数;其他行被丢弃。只有聚合的窗口函数才接受 FILTER 子句。

但是,下面的测试似乎与此相矛盾:

create table test_1 as
select generate_series(1,10) as num;    

select
  *,
  sum(num) over last_2,
  sum(num) filter (where  num % 2 = 0) over last_2
from test_1
window
    last_2 as (order by num rows 1 preceding)
;

这会返回:

 num | sum |  sum   
-----+-----+--------
   1 |   1 | [null]
   2 |   3 |      2
   3 |   5 |      2
   4 |   7 |      4
   5 |   9 |      4
   6 |  11 |      6
   7 |  13 |      6
   8 |  15 |      8
   9 |  17 |      8
  10 |  19 |     10
(10 rows)

以第四行为例。在这里,聚合函数应该接收最后两个偶数行(即 2 和 4)。所以我预计这个总和是 6。

我误会了什么?

注意:这是一个人为的例子,它提炼了我实际上正在努力解决的问题。显然有更好的方法来找到偶数的移动和。

【问题讨论】:

【参考方案1】:

over 子句优先于 filter 子句。所以你取 last_2 (即当前行和前一行)并从中过滤,这只会得到一行(偶数行)。

您正在寻找的是:

sum(case when num % 2 = 0 then num else 0 end) over last_2

【讨论】:

这是有道理的。我应该怎么做我真正想做的事? 谢谢!如果聚合函数是 AVG(),这将取决于行数? 然后改用sum(case when num % 2 = 0 then num end) over last_2 / count(case when num % 2 = 0 then num end) over last_2。或者等等,avg 不是已经忽略空值了吗?那么即使avg(case when num % 2 = 0 then num end) over last_2 也应该这样做。

以上是关于聚合窗口中的过滤器子句未按预期丢弃行的主要内容,如果未能解决你的问题,请参考以下文章

数据视图行过滤器未按预期工作

CSS 背景颜色未按预期运行

VUE3 复合过滤器未按预期工作

核心图像过滤器 CISourceOverCompositing 未按预期显示与 alpha 叠加

从 views_php 过滤器返回 TRUE 未按预期工作

select count() 查询中的限制子句未按预期工作