聚合窗口中的Filter子句不按预期方式丢弃行

时间:2016-06-15 15:56:54

标签: sql postgresql aggregate-functions window-functions postgresql-9.4

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

  

如果指定了FILTER,则只将filter_clause计算为true的输入行提供给window函数;其他行被丢弃。只有聚合的窗口函数才接受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 个答案:

答案 0 :(得分:1)

over子句优先于filter子句。所以你取last_2(即当前行和前一行)并从这些过滤器中获取只有一行(偶数行)。

你要找的是:

<table id="myTable" class="table table-bordered table-condensed .zebra-striped">
<thead>
<tr>
<th width="20">#</th>
<th>Libelle</th>
<th width="100">Account number</th>
</tr>
</thead>
<tbody>

{% for item in entity.elements %}
<tr>
<td> {{loop.index}}</td>
<td> {{item.libelle}}</td>
<td><input type="text" name="namecpte[]" class="cpte" id="idcpte_{{loop.index}}"></td>
</tr>
{% endfor %}

</tbody>
</table>