0

フィルタ句は、行をウィンドウ関数に渡す前に行を破棄すると考えます。集計ウィンドウのフィルタ句は、期待通りに行を破棄しません。

フィルタが指定された場合、filter_clauseが真と評価される唯一の入力行は窓関数に供給される; docsから他の行は破棄されます。集計であるウィンドウ関数のみが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) 

は、一例として4行目を取ります。ここで、集合関数は、最後の2つの偶数行(すなわち、2および4)を受け取るべきである。だから私はこの合計が6になると期待します。

私は何を誤解していますか?

注:これは、私が実際に苦労している問題を掘り下げて考案した例です。明らかに偶数の移動合計を見つけるより良い方法があります。

答えて

1

over節がfilter節よりも優先されます。したがって、last_2(つまり現在の行と前の行)を取得し、これらのフィルタを使用すると、1つの行(偶数行)のみが表示されます。理にかなって

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

は、あなたが代わりを探していることはこれです。私が実際にやろうとしていることは、どうしたらいいですか? – cammil

+0

私はちょうど私の答えを更新しました:-) –

+0

ありがとう!集計関数が行数に依存するAVG()の場合はどうなりますか? – cammil

関連する問題