A 창 기능현재 행과 관련이 있는 테이블 행 집합에 대해 계산을 수행합니다. 이는 집계 함수를 사용하여 수행할 수 있는 계산 유형과 비슷합니다. 그러나 창 함수는 창 이외의 집계 호출처럼 행을 단일 출력 행으로 그룹화하지 않습니다. 대신 행은 별도의 ID를 유지합니다. 그 뒤에서 창 함수는 쿼리 결과의 현재 행보다 더 많은 것에 액세스할 수 있습니다.
다음은 각 직원의 급여를 해당 부서의 평균 급여와 비교하는 방법을 보여주는 예입니다.
SELECT depname, empno, Salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
부서이름 | 엠프노 | 급여 | 평균 ---------+---------+---------+---------- 개발 | 11 | 5200 | 5020.0000000000000000 개발 | 7 | 4200 | 5020.0000000000000000 개발 | 9 | 4500 | 5020.0000000000000000 개발 | 8 | 6000 | 5020.0000000000000000 개발 | 10 | 5200 | 5020.0000000000000000 인사 | 5 | 3500 | 3700.0000000000000000 인사 | 2 | 3900 | 3700.0000000000000000 판매 | 3 | 4800 | 4866.6666666666666667 판매 | 1 | 5000 | 4866.6666666666666667 판매 | 4 | 4800 | 4866.6666666666666667 (10행)
처음 세 개의 출력 열은 테이블에서 직접 나옵니다.직원급여, 테이블의 각 행마다 하나의 출력 행이 있습니다. 네 번째 열은 동일한 값을 갖는 모든 테이블 행에 대한 평균을 나타냅니다.부서이름값을 현재 행으로 설정합니다. (실제로는 비창문과 동일한 기능입니다.평균집계되지만이상절을 사용하면 창 스포츠 토토 베트맨로 처리되고 창 프레임 전체에서 계산됩니다.)
창 스포츠 토토 베트맨 호출에는 항상가 포함됩니다.이상창 스포츠 토토 베트맨의 이름과 인수 바로 뒤에 오는 절. 이것이 일반 스포츠 토토 베트맨나 비창 집계와 구문적으로 구별되는 점입니다.이상절은 창 스포츠 토토 베트맨에 의한 처리를 위해 쿼리 행을 분할하는 방법을 정확하게 결정합니다.파티션 기준내부 절이상행을 동일한 값을 공유하는 그룹 또는 파티션으로 나눕니다.파티션 기준식. 각 행에 대해 창 함수는 현재 행과 동일한 파티션에 속하는 행에서 계산됩니다.
또한 다음을 사용하여 창 기능에 의해 행이 처리되는 순서를 제어할 수 있습니다.주문 기준내부이상. (창문)주문 기준행이 출력되는 순서와 일치할 필요도 없습니다.) 다음은 예입니다.
SELECT 부서 이름, empno, 급여,
순위() OVER (PARTITION BY 부서 이름 ORDER BY 급여 DESC)
직원 급여에서;
부서이름 | 엠프노 | 급여 | 순위 ---------+---------+---------+------ 개발 | 8 | 6000 | 1 개발 | 10 | 5200 | 2 개발 | 11 | 5200 | 2 개발 | 9 | 4500 | 4 개발 | 7 | 4200 | 5 인사 | 2 | 3900 | 1 인사 | 5 | 3500 | 2 판매 | 1 | 5000 | 1 판매 | 4 | 4800 | 2 판매 | 3 | 4800 | 2 (10행)
여기에 표시된 대로,순위함수는 각 고유 항목에 대한 숫자 순위를 생성합니다.주문 기준현재 행 파티션의 값, 정의된 순서 사용주문 기준절.순위동작이 전적으로 다음에 의해 결정되므로 명시적인 매개변수가 필요하지 않습니다.이상절.
창 함수에 의해 고려되는 행은 다음의 행입니다.“가상 테이블”쿼리로 생성됨발신해당 항목으로 필터링된 절어디, 그룹별및가지고 있는 중절이 있는 경우. 예를 들어, 다음을 충족하지 않아 제거된 행은어디에서조건은 어떤 창 스포츠 토토 베트맨에서도 볼 수 없습니다. 쿼리에는 서로 다른 방법을 사용하여 데이터를 분할하는 여러 창 스포츠 토토 베트맨가 포함될 수 있습니다.이상절이지만 모두 이 가상 테이블에 의해 정의된 동일한 행 컬렉션에 대해 작동합니다.
우리는 이미 그것을 보았습니다주문 방법행 순서가 중요하지 않은 경우 생략할 수 있습니다. 생략도 가능합니다파티션 기준, 이 경우 모든 행을 포함하는 단일 파티션이 있습니다.
창 기능과 관련된 또 다른 중요한 개념이 있습니다. 각 행에 대해 해당 파티션 내에 해당라는 행 집합이 있습니다.창틀. 일부 창 기능은 전체 파티션이 아닌 창 프레임의 행에서만 작동합니다. 기본적으로 다음과 같은 경우주문 기준이 제공되면 프레임은 파티션 시작부터 현재 행까지의 모든 행과 다음에 따라 현재 행과 동일한 다음 행으로 구성됩니다.주문 기준절. 언제주문 기준생략되었으며 기본 프레임은 파티션의 모든 행으로 구성됩니다.[5]다음은 다음을 사용한 예입니다.합계:
SELECT 급여, 합계(급여) OVER () FROM empsalary;
급여 | 합계 ------+------- 5200 | 47100 5000 | 47100 3500 | 47100 4800 | 47100 3900 | 47100 4200 | 47100 4500 | 47100 4800 | 47100 6000 | 47100 5200 | 47100 (10행)
위, 없기 때문에주문 기준에서이상절, 창 프레임은 파티션과 동일하지만 부족합니다.파티션 기준는 전체 테이블입니다. 즉, 각 합계가 전체 테이블에 적용되므로 각 출력 행에 대해 동일한 결과를 얻습니다. 하지만 만약 우리가주문 기준절, 우리는 매우 다른 결과를 얻습니다:
SELECT 급여, 합계(급여) OVER (ORDER BY 급여) FROM empsalary;
급여 | 합계 ------+------- 3500 | 3500 3900 | 7400 4200 | 11600 4500 | 16100 4800 | 25700 4800 | 25700 5000 | 30700 5200 | 41100 5200 | 41100 6000 | 47100 (10행)
여기서 합계는 현재 급여의 중복을 포함하여 첫 번째(최저) 급여부터 현재 급여까지 계산됩니다(중복 급여 결과에 유의하세요).
창 기능은 다음에서만 허용됩니다.선택목록 및주문 기준쿼리의 절입니다. 다음과 같은 다른 곳에서는 금지되어 있습니다.그룹별, 가지고 있는 중그리고어디절. 이는 해당 절을 처리한 후에 논리적으로 실행되기 때문입니다. 또한 창 함수는 창이 아닌 집계 함수 후에 실행됩니다. 이는 창 함수의 인수에 집계 함수 호출을 포함하는 것이 유효하지만 그 반대는 유효하지 않음을 의미합니다.
창 계산이 수행된 후 행을 필터링하거나 그룹화해야 하는 경우 하위 선택을 사용할 수 있습니다. 예를 들면:
SELECT 부서 이름, empno, 급여, 등록_날짜
에서
(SELECT 부서 이름, empno, 급여, 등록_날짜,
순위() OVER (PARTITION BY depname ORDER BY 급여 DESC, empno) AS pos
직원 급여에서
) AS SS
위치 < 3;
위 쿼리는 내부 쿼리의 행만 표시합니다.순위3보다 작습니다.
쿼리가 여러 개의 창 기능을 포함하는 경우 각각을 별도의 창 함수로 작성할 수 있습니다.이상절이지만, 여러 함수에 대해 동일한 창 동작이 필요한 경우 중복되고 오류가 발생하기 쉽습니다. 대신 각 창 동작의 이름을 다음과 같이 지정할 수 있습니다.창절 이후에 참조됨이상. 예를 들면:
SELECT 합계(급여) OVER w, 평균(급여) OVER w 직원 급여에서 WINDOW w AS (PARTITION BY 부서 이름 ORDER BY 급여 DESC);
창 기능에 대한 자세한 내용은 다음에서 찾을 수 있습니다.섹션 4.2.8, 범퍼카 토토 : 문서 : 15 : 9.22. 창 범퍼카 토토, 섹션 7.2.5그리고선택참조 페이지.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.