복붙노트

[SQL] 윈도우 함수의 FILTER 절에서 현재 행을 참조하기

SQL

윈도우 함수의 FILTER 절에서 현재 행을 참조하기

PostgreSQL의 9.4 창 함수 처리 창틀의 서브 세트를 선택하기위한 필터의 새로운 옵션을 갖는다. 문서는 그것을 언급,하지만 샘플을 제공하지 않습니다. 온라인 검색, 몇 가지 샘플을 얻을 수 2ndQuadrant에서 포함하지만 내가 발견 한 모든 오히려 상수 식으로 사소한 예였다. 내가 찾던 현재 행의 값을 포함하는 필터 식이다.

내가 날짜 유형 중 하나는 열,의 무리와 함께 테이블이 있다고 가정 :

col1 | col2 |     dt
------------------------
  1  |  a   | 2015-07-01
  2  |  b   | 2015-07-03
  3  |  c   | 2015-07-10
  4  |  d   | 2015-07-11
  5  |  e   | 2015-07-11
  6  |  f   | 2015-07-13
...

전체 테이블 위에 날 처리 윈도우 정의 소소 구성된다 : 윈도우 AS 승리 (DT ORDER BY)

내가 존재하는 행 수를 알고에 관심이 있어요, 말, 4 일 현재 행 이전에 (포함). 그래서이 출력을 생성하려면 :

col1 | col2 |     dt     | count
--------------------------------
  1  |  a   | 2015-07-01 |   1
  2  |  b   | 2015-07-03 |   2
  3  |  c   | 2015-07-10 |   1
  4  |  d   | 2015-07-11 |   3
  5  |  e   | 2015-07-11 |   3
  6  |  f   | 2015-07-13 |   4
...

윈도우 기능의 FILTER 절은 당연한 선택처럼 보인다 :

count(*) FILTER (WHERE current_row.dt - dt <= 4) OVER win

하지만 어떻게 내가 (더 나은 구문의 부족) current_row.dt를 지정합니까? 이 경우에도 가능합니까?

이것이 가능하지 않다면, 윈도우 프레임에 날짜 범위를 선택하는 다른 방법이있다? 이 모든 행 기반으로 프레임 사양은 전혀 도움이되지 않습니다.

나는 창 처리를 기반으로하는 하위 쿼리를 사용하여 다른 솔루션에 관심이 아니에요.

해결법

  1. ==============================

    1.새로운 집계 FILTER 절은 올바른 도구가 아닙니다, 그래서 당신은 실제로 행을 집계하지 않습니다. 윈도우 함수하지만, 그것보다, 문제가 남아 같다 : 윈도우의 프레임 정의는 현재 행의 값에 의존 할 수 없다. 그것은 단지 앞 또는 ROWS 절을 다음 행 주어진 숫자를 셀 수 있습니다.

    새로운 집계 FILTER 절은 올바른 도구가 아닙니다, 그래서 당신은 실제로 행을 집계하지 않습니다. 윈도우 함수하지만, 그것보다, 문제가 남아 같다 : 윈도우의 프레임 정의는 현재 행의 값에 의존 할 수 없다. 그것은 단지 앞 또는 ROWS 절을 다음 행 주어진 숫자를 셀 수 있습니다.

    그 일을하려면, 일, LEFT 당 총 수는 범위 내에서 일의 전체 집합에 가입하세요. 그런 다음 윈도우 함수를 적용 할 수 있습니다 :

    SELECT t.*, ct.ct_last4days
    FROM  (
       SELECT *, sum(ct) OVER (ORDER BY dt ROWS 3 PRECEDING) AS ct_last4days
       FROM  (
          SELECT generate_series(min(dt), max(dt), interval '1 day')::date AS dt
          FROM   tbl t1
          ) d
       LEFT   JOIN (SELECT dt, count(*) AS ct FROM tbl GROUP BY 1) t USING (dt)
       ) ct
    JOIN  tbl t USING (dt);
    

    순서가 하위 쿼리에서 generate_series () 이월되기 때문에 과부 프레임 정의 DT에 의해 ORDER를 생략하면 일반적으로 작동합니다. 그러나이 명시 적 ORDER BY없이 SQL 표준의 보장은 없습니다 그것은 더 복잡한 쿼리에서 깰 수 있습니다.

    SQL 바이올린.

    관련 :

  2. ==============================

    2.나는 표현의 수단 "현재 행"그 구문이 있다고 생각하지 않습니다. 포스트 그레스의 gram.y 파일은 필터 절을한다 단지 보통의 표현 조항입니다 단지 a_expr를 취할. 그곳에 표현의 윈도우 함수 또는 필터 절에 아무것도 특정입니다. 지금까지 내가 찾을 수있는 창이 절에서 유일하게 현재 행의 개념은 창 프레임의 경계를 지정하는 것입니다. 나는이 당신을 얻을 생각하지 않는다 당신이 원하는 것을.

    나는 표현의 수단 "현재 행"그 구문이 있다고 생각하지 않습니다. 포스트 그레스의 gram.y 파일은 필터 절을한다 단지 보통의 표현 조항입니다 단지 a_expr를 취할. 그곳에 표현의 윈도우 함수 또는 필터 절에 아무것도 특정입니다. 지금까지 내가 찾을 수있는 창이 절에서 유일하게 현재 행의 개념은 창 프레임의 경계를 지정하는 것입니다. 나는이 당신을 얻을 생각하지 않는다 당신이 원하는 것을.

    그것은 당신이 둘러싸는 쿼리에서 약간의 견인을 얻을 수있는 가능성이 있습니다 :

    http://www.postgresql.org/docs/current/static/sql-expressions.html

    하지만 어떻게 나에게 분명 아니다.

  3. from https://stackoverflow.com/questions/31396434/referencing-current-row-in-filter-clause-of-window-function by cc-by-sa and MIT license