창 함수 호출 은 쿼리에 의해 선택된 행의 일부에 대한 집계 유사 함수의 적용을 나타냅니다 . 비 윈도우 집계 호출과 달리 이것은 선택한 행을 단일 출력 행으로 그룹화하는 것과 관련이 없습니다. 각 행은 쿼리 출력에서 개별적으로 유지됩니다. PARTITION BY그러나 창 함수는 창 함수 호출의 그룹화 사양( 목록)에 따라 현재 행 그룹의 일부가 될 모든 행에 액세스할 수 있습니다 . 창 함수 호출의 구문은 다음 중 하나입니다.
function_name([ expression[ , expression... ] ]) [ 필터 ( WHERE filter_clause) ] 오버 ([ [ , ... ] ]) [ 필터 ( WHERE ) ] 오버 ( )
( * ) [ 필터 ( WHERE ) ] 오버 ( * ) [ 필터 ( 어디 ) ] 위에 ( )
window_name
function_nameexpressionexpressionfilter_clausewindow_definitionfunction_namefilter_clausewindow_name
function_namefilter_clausewindow_definition
window_definition구문이 있는 곳
[ existing_window_name]
[ 파티션 기준 expression[, ...] ]
[ 주문 BY expression[ ASC | DESC | 사용 operator] [ NULLS { 첫 번째 | 마지막 } ] [, ...] ]
[ frame_clause]
선택 사항 frame_clause은 다음 중 하나일 수 있습니다.
{ 범위 | 행 | 그룹 } frame_start[ frame_exclusion]
{ 범위 | 행 | 그룹 } 사이 frame_start및 frame_end[ frame_exclusion]
어디 frame_start중 frame_end하나가 될 수 있습니다
무제한 선행
offset선행
현재 행
offset수행원
언바운드 팔로우
그리고 frame_exclusion다음 중 하나가 될 수 있습니다
현재 행 제외
그룹 제외
관계 제외
다른 사람을 제외하지 마십시오
여기서 expression은 자체적으로 창 함수 호출을 포함하지 않는 값 표현식을 나타냅니다.
window_nameWINDOW쿼리 절 에 정의된 명명된 창 사양에 대한 참조 입니다. window_definition또는 절 에서 명명된 창을 정의하는 것과 동일한 구문을 사용하여 괄호 안에 전체 를 지정할 수 있습니다 WINDOW. 자세한 내용은 SELECT 참조 페이지를 참조하십시오. OVER wname와 정확히 동일하지 않다는 점을 지적할 가치가 있습니다 OVER (wname ...). 후자는 창 정의 복사 및 수정을 의미하며 참조된 창 사양에 프레임 절이 포함된 경우 거부됩니다.
이 절은 쿼리 행을 파티션PARTITION BY 으로 그룹화하며 , 이 파티션은 창 함수에 의해 별도로 처리됩니다. 표현식이 항상 표현식이고 출력 열 이름이나 숫자가 될 수 없다는 점을 제외하면 쿼리 수준 절과 유사하게 작동 합니다. 가 없으면 쿼리에 의해 생성된 모든 행이 단일 파티션으로 처리됩니다. 이 절은 파티션의 행이 창 함수에 의해 처리되는 순서를 결정합니다. 쿼리 수준 절과 유사하게 작동하지만 마찬가지로 출력 열 이름이나 숫자를 사용할 수 없습니다. 가 없으면 행이 지정되지 않은 순서로 처리됩니다.PARTITION BYGROUP BYPARTITION BYORDER BYORDER BYORDER BY
전체 파티션 대신 프레임에서 작동하는 창 함수에 대해 현재 파티션의 하위 집합인 창 프레임을 구성 하는frame_clause 행 집합을 지정합니다 . 프레임의 행 집합은 현재 행이 어느 행인지에 따라 달라질 수 있습니다. 프레임은 , 또는 모드 에서 지정할 수 있습니다 . 각각의 경우 에서 까지 실행 됩니다 . 생략하면 끝은 기본적 으로 .RANGEROWSGROUPSframe_startframe_endframe_endCURRENT ROW
A frame_startof UNBOUNDED PRECEDING는 프레임이 파티션의 첫 번째 행에서 시작한다는 것을 의미하고, 마찬가지로 frame_endof UNBOUNDED FOLLOWING는 프레임이 파티션의 마지막 행에서 끝나는 것을 의미합니다.
RANGE또는 GROUPS모드에서 a of frame_start는 CURRENT ROW프레임이 현재 행의 첫 번째 피어 행(창의 ORDER BY절이 현재 행과 동일한 것으로 정렬하는 행)에서 시작함을 의미하고 a frame_endof CURRENT ROW는 프레임이 현재 행의 마지막 피어 행으로 끝나는 것을 의미합니다. ROWS모드에서 단순히 CURRENT ROW현재 행을 의미합니다.
및 프레임 옵션에서 변수 , 집계 함수 또는 창 함수를 포함하지 않는 표현식이어야 합니다. 의 의미는 프레임 모드에 따라 다릅니다.offset PRECEDINGoffset FOLLOWINGoffsetoffset
- ROWS모드에서 는 null offset이 아닌 음수가 아닌 정수를 생성해야 하며 이 옵션은 프레임이 현재 행 앞이나 뒤에 지정된 수의 행을 시작하거나 종료함을 의미합니다.
- GROUPS모드에서 다시 offset는 null이 아닌, 음이 아닌 정수를 생성해야 하며, 이 옵션은 프레임이 현재 행의 피어 그룹 앞이나 뒤에 지정된 수의 피어 그룹을 시작하거나 종료한다는 것을 의미합니다. 여기서 피어 그룹은 다음 집합입니다 .ORDER BY 순서 에 해당하는 행 . ORDER BY(모드 를 사용하려면 창 정의에 절이 있어야 합니다 GROUPS.)
- 모드에서 이러한 RANGE옵션을 사용하려면 ORDER BY절이 정확히 하나의 열을 지정해야 합니다. 현재 offset행의 해당 열 값과 프레임의 앞 또는 뒤 행에 있는 값 사이의 최대 차이를 지정합니다. 표현식 의 offset데이터 유형은 정렬 열의 데이터 유형에 따라 다릅니다. 숫자 정렬 열의 경우 일반적으로 정렬 열과 동일한 유형이지만 날짜/시간 정렬 열의 경우 interval. 예를 들어, 정렬 열이 date또는 유형인 경우 timestamp작성할 수 RANGE BETWEEN '1 day' PRECEDING AND '10 days' FOLLOWING있습니다. " non-negative " 의 의미 는 데이터 유형에 따라 다르지만 offset여전히 null이 아니고 음수가 아니어야 합니다.
어떤 경우든 프레임 끝 부분까지의 거리는 파티션 끝 부분까지의 거리로 제한되므로 파티션 끝 부분에 가까운 행의 경우 프레임에 다른 곳보다 더 적은 수의 행이 포함될 수 있습니다.
ROWS및 GROUPS모드 모두 에서 0 PRECEDING및 0 FOLLOWING는 와 동일합니다 CURRENT ROW. 이는 일반적으로 " 0 "RANGE 의 적절한 데이터 유형별 의미에 대해 모드에서도 유지됩니다 .
이 frame_exclusion옵션을 사용하면 프레임 시작 및 프레임 끝 옵션에 따라 포함되는 경우에도 현재 행 주변의 행이 프레임에서 제외될 수 있습니다. EXCLUDE CURRENT ROW프레임에서 현재 행을 제외합니다. EXCLUDE GROUP프레임에서 현재 행과 순서 지정 피어를 제외합니다. EXCLUDE TIES프레임에서 현재 행의 모든 피어를 제외하지만 현재 행 자체는 제외합니다. EXCLUDE NO OTHERS단순히 현재 행이나 해당 피어를 제외하지 않는 기본 동작을 명시적으로 지정합니다.
기본 프레임 옵션은 RANGE UNBOUNDED PRECEDING과(와) 같습니다 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. 를 사용하면 ORDER BY프레임이 파티션 시작부터 현재 행의 마지막 ORDER BY피어까지의 모든 행으로 설정됩니다. 가 없으면 ORDER BY모든 행이 현재 행의 피어가 되므로 파티션의 모든 행이 창 프레임에 포함됩니다.
제한 사항은 frame_start수 없음 UNBOUNDED FOLLOWING, frame_end수 없음 UNBOUNDED PRECEDING및 선택 항목이 위의 및 옵션 frame_end목록에서 선택 항목보다 먼저 나타날 수 없다는 것입니다(예 : 허용되지 않음). 그러나 예를 들어 행을 선택하지 않더라도 허용됩니다.frame_startframe_endframe_startRANGE BETWEEN CURRENT ROW AND offset PRECEDINGROWS BETWEEN 7 PRECEDING AND 8 PRECEDING
가 지정 되면 true로 평가 FILTER되는 입력 행만 창 함수에 제공됩니다. filter_clause다른 행은 버려집니다. 집계인 창 함수만 FILTER절을 수락합니다.
내장된 창 기능은 표 9.62 에 설명되어 있습니다. 다른 창 기능은 사용자가 추가할 수 있습니다. 또한 내장 또는 사용자 정의 범용 또는 통계 집계를 창 함수로 사용할 수 있습니다. (Ordered-set 및 hypothetical-set 집계는 현재 창 함수로 사용할 수 없습니다.)
를 사용하는 구문 *은 매개변수가 없는 집계 함수를 창 함수로 호출하는 데 사용됩니다(예: count(*) OVER (PARTITION BY x ORDER BY y). 별표( *)는 일반적으로 창 관련 기능에 사용되지 않습니다. 창 특정 함수는 함수 인수 목록 내에서 사용 DISTINCT하거나 허용하지 않습니다.ORDER BY
창 함수 호출은 쿼리 의 SELECT목록과 절 에서만 허용됩니다 .ORDER BY
창 기능에 대한 자세한 내용은 3.5 절 , 9.22 절 , 7.2.5 절에서 찾을 수 있습니다 .
'Postgresql_DB_가이드' 카테고리의 다른 글
함수 호출 (0) | 2022.08.04 |
---|---|
유형 캐스트 (0) | 2022.07.18 |
연산자 호출 (0) | 2022.07.18 |
4.2. 값 표현식 (0) | 2022.07.18 |
첨자 (0) | 2022.07.18 |