a창 롤 토토수행 a 어떻게 든 관련된 일련의 테이블 행의 계산 현재 행에. 이것은 계산 유형과 비슷합니다 그것은 집계 기능으로 수행 할 수 있습니다. 그러나 정기와는 달리 집계 함수, 창 롤 토토를 사용하면 행이 발생하지 않습니다. 단일 출력 행으로 그룹화하려면 - 행이 유지됩니다. 그들의 별도의 정체성. 무대 뒤에서 창 롤 토토 쿼리의 현재 행 이상에 더 액세스 할 수 있습니다. 결과.
각 직원의 비교 방법을 보여주는 예는 다음과 같습니다. 부서의 평균 급여와 급여 :
Depname, Empno, Salary, Avg (Salary) Over (Depname에 의한 파티션)를 선택하여 Empsalary;
depname | Empno | 급여 | avg -----------+-------+--------+------------------------- 개발 | 11 | 5200 | 5020.00000000000000 개발 | 7 | 4200 | 5020.00000000000000 개발 | 9 | 4500 | 5020.00000000000000 개발 | 8 | 6000 | 5020.00000000000000 개발 | 10 | 5200 | 5020.00000000000000 인원 | 5 | 3500 | 3700.00000000000000 인원 | 2 | 3900 | 3700.00000000000000 판매 | 3 | 4800 | 4866.666666666666667 판매 | 1 | 5000 | 4866.666666666666667 판매 | 4 | 4800 | 4866.666666666666667 (10 줄)
처음 3 개의 출력 열은 테이블에서 직접 제공empsalary, 하나의 출력이 있습니다
테이블의 각 행에 대해 행. 네 번째 열은 an을 나타냅니다
동일한 모든 테이블 행을 가로 질러 평균depname현재 행으로 값.
(이것은 실제로 일반과 같은 기능입니다avg
집계 롤 토토이지만Over절은 창으로 취급됩니다
적절한 행 세트에서 기능하고 계산됩니다.)
창 롤 토토 호출은 항상를 포함합니다.Over창 롤 토토 이름에 따른 절 그리고 논쟁. 이것이 구문 적으로 구별하는 것입니다 규칙적인 기능 또는 집계 기능. 그만큼Over절의 행이 정확히 어떻게 결정되는지를 결정합니다 쿼리는 창 롤 토토로 처리하기 위해 분할됩니다. 그만큼파티션 by내에서 목록Over행을 그룹으로 나누는 것을 지정합니다 파티션, 동일한 값을 공유하는파티션 by표현. 각 행에 대해 창 롤 토토는 현재 행과 동일한 파티션.
비록avg
파티션을 처리하는 순서가 상관없이 동일한 결과
행은 모든 창 롤 토토에 해당되는 것은 아닙니다. 필요할 때
당신은 그 순서를 사용하여를 제어 할 수 있습니다.주문
에 의해내Over. 여기에 있습니다
예:
Depname, Empno, Salary, Rank () Over (Empsalary의 Depname 주문별로)를 선택하십시오.
Depname | Empno | 급여 | 계급 ----------+-------+--------+------ 개발 | 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 줄)
여기에 표시된대로RANK
롤 토토
현재 행의 파티션 내에서 숫자 순위를 생성합니다.
각각 뚜렷한주문 by에 정의 된 주문주문 by절.RANK
명시적인 매개 변수가 필요하지 않습니다.
그 행동은 전적으로에 의해 결정되기 때문에Over절.
창 롤 토토로 고려되는 행은의 행입니다."가상 테이블"쿼리From조항에 의해 필터링 된 조항여기서, 그룹 에 의해및클로즈가있는 경우. 을 위한 예를 들어, 행은를 충족하지 않기 때문에 제거되었습니다.여기서조건은 어떤 창에서도 보이지 않습니다 기능. 쿼리에는 여러 개의 창 롤 토토가 포함될 수 있습니다 다른 방식으로 데이터를 다른 방식으로 슬라이스Over클로즈이지만 모두 행동합니다 이 가상 테이블에 의해 정의 된 동일한 행 모음.
우리는 이미 그것을 보았습니다주문할 수 있습니다 행의 순서가 중요하지 않은 경우 생략했습니다. 그것은 또한 생략 가능파티션 by케이스 모든 행이 포함 된 단 하나의 파티션이 있습니다.
창과 관련된 또 다른 중요한 개념이 있습니다
롤 토토 : 각 행마다 그 안에 행이 있습니다.
파티션은이라고 불렀습니다.창 프레임. 많은
(전부는 아님) 창 롤 토토는 창의 행에서만 행동합니다.
전체 파티션이 아닌 프레임. 기본적으로 if주문 by그 다음 프레임이 제공됩니다
파티션 시작부터 모든 행으로 구성됩니다.
현재 행, 그리고 다음 행과 같은 행
현재 행주문 by절. 언제주문 by생략되었습니다
기본 프레임은 파티션의 모든 행으로 구성됩니다.[1]여기를 사용하는 예는입니다.Sum
:
empsalary에서 ()를 Over () Over ()를 선택하여;
급여 | 합집합 --------+------- 5200 | 47100 5000 | 47100 3500 | 47100 4800 | 47100 3900 | 47100 4200 | 47100 4500 | 47100 4800 | 47100 6000 | 47100 5200 | 47100 (10 줄)
위, 없기 때문에주문 byin 그만큼Over조항, 창 프레임은 파티션과 동일합니다.파티션 by전체 테이블입니다. 다시 말해서 각 합계는 전체 테이블을 통해 취해서 우리는 동일하게됩니다. 각 출력 행에 대한 결과. 그러나 우리가 추가하면주문 by절, 우리는 매우 다릅니다 결과:
empsalary의 급여, 금액 (급여)을 선택하십시오.
급여 | 합집합 --------+------- 3500 | 3500 3900 | 7400 4200 | 11600 4500 | 16100 4800 | 25700 4800 | 25700 5000 | 30700 5200 | 41100 5200 | 41100 6000 | 47100 (10 줄)
여기에서 합계는 첫 번째 (가장 낮은) 급여에서 가져옵니다. 현재의 중복을 포함하여 현재를 통해 하나 (복제 된 급여의 결과를 주목).
창 롤 토토는에서만 허용됩니다.select목록 및주문 에 의해쿼리 조항. 그들은 다른 곳에서 금지되어 있습니다 에서와 같이그룹 by, and여기서조항. 처리 후 논리적으로 실행되기 때문입니다. 그 조항. 또한 창 롤 토토는 정기 후에 실행됩니다 집계 기능. 이것은 포함하는 것이 유효하다는 것을 의미합니다 창 롤 토토의 인수에서 집계 함수 호출, 그러나 그 반대는 아닙니다.
창 뒤에 필터링 또는 그룹 행이 필요한 경우 계산이 수행되며 하위 선택을 사용할 수 있습니다. 을 위한 예:
Depname, Empno, Salary, enroll_date를 선택하십시오 에서 (Depname, Empno, Salary, enroll_date, rank () Over (POS로서 DEPNAME ORDER에 의한 분할) POS로 empsalary에서 ) SS로서 여기서 pos <3;
위의 쿼리는 내부 쿼리의 행만 표시합니다. hadeRANK3.
쿼리에 여러 개의 창 롤 토토가 포함되면 그렇습니다 별도의 각각을 쓸 수 있습니다Over조항이지만 이것은 중복입니다 동일한 윈도우 동작이 여러 곳에서 원하는 경우 오류가 발생하기 쉽습니다. 기능. 대신, 각 윈도우 동작은 A에서 이름을 지정할 수 있습니다.창절과 참조Over. 예를 들어:
W에서 W, AVG (급여)를 통해 합 (급여)을 선택하십시오 empsalary에서 Window W as (Salary Desc의 Depname Order에 의한 파티션);
창 롤 토토에 대한 자세한 내용은 찾을 수 있습니다.섹션 4.2.8, PostgreSQL : 문서 : 9.0 : 창 사설 토토, 섹션 7.2.4및select참조 페이지.
[1] |
기타 창 프레임을 정의하는 옵션이 있습니다. 방법이지만이 튜토리얼은이를 다루지 않습니다. 보다섹션 4.2.8자세한 내용. |