0

행을 창 함수에 전달하기 전에 필터 절에서 행을 무시해야합니다. 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 절이 필터 절보다 우선합니다. 따라서 last_2 (즉 현재 행과 이전 행)를 가져 와서 필터링하면 하나의 행 (짝수 행) 만 표시됩니다. 의미가

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

:

은 무엇 대신 찾고있는 것은 이것이다. 내가 실제로하려고하는 일을 어떻게해야합니까? – cammil

+0

방금 ​​내 대답을 업데이트했습니다 :-) –

+0

고마워요! 집계 함수가 AVG() 인 경우 행 수가 달라집니다. – cammil

관련 문제