2.7. 젠 토토 함수

대부분의 다른 관계형 데이터베이스 제품과 마찬가지로,PostgreSQL지원젠 토토 함수. 젠 토토 함수는 여러 입력 행에서 단일 결과를 계산합니다. 예를 들어, 다음을 계산하는 집계가 있습니다.개수, 합계, 평균(평균),최대(최대) 및(최소) 행 집합에 대해.

예를 들어, 다음을 통해 어디에서나 가장 높은 저온 판독값을 찾을 수 있습니다.

날씨에서 최대(temp_lo) 선택;
최대
-----
  46
(1행)

독서가 발생한 도시(또는 도시)를 알고 싶다면 다음을 시도해 볼 수 있습니다.

날씨가 있는 도시를 선택하세요. temp_lo = max(temp_lo);틀림

그러나 이것은 젠 토토 이후로는 작동하지 않습니다최대다음에서는 사용할 수 없습니다.어디절. (이 제한사항은 다음과 같은 이유로 존재합니다.어디절은 집계 계산에 포함될 행을 결정합니다. 따라서 젠 토토 함수가 계산되기 전에 평가되어야 합니다.) 그러나 종종 그렇듯이 원하는 결과를 얻기 위해 쿼리를 다시 작성할 수 있습니다. 여기서는 다음을 사용합니다.하위 쿼리:

날씨에서 도시를 선택하세요
    WHERE temp_lo = (날씨에서 최대(temp_lo) 선택);
도시
---------------
 샌프란시스코
(1행)

하위 쿼리는 외부 쿼리에서 발생하는 것과 별도로 자체 집계를 계산하는 독립적인 계산이기 때문에 괜찮습니다.

집계는 다음과 결합하여 매우 유용합니다.그룹별절. 예를 들어 다음을 사용하여 각 도시에서 관찰된 판독값 수와 최대 최저 기온을 얻을 수 있습니다.

SELECT 도시, 개수(*), 최대(temp_lo)
    날씨로부터
    도시별로 그룹화;
도시 | 카운트 | 최대
---------------+---------+-----
 헤이워드 |     1 |  37
 샌프란시스코 |     2 |  46
(2행)

도시당 하나의 출력 행을 제공합니다. 각 집계 결과는 해당 도시와 일치하는 테이블 행에 대해 계산됩니다. 다음을 사용하여 그룹화된 행을 필터링할 수 있습니다.하빙:

SELECT 도시, 개수(*), 최대(temp_lo)
    날씨로부터
    도시별 그룹
    최대(temp_lo) < 40;
도시 | 카운트 | 최대
--------+---------+-----
 헤이워드 |     1 |  37
(1행)

이는 모든 것을 갖춘 도시에 대해서만 동일한 결과를 제공합니다temp_lo40 미만의 값. 마지막으로 이름이 다음으로 시작하는 도시에만 관심이 있다면S, 다음과 같이 할 수도 있습니다:

SELECT 도시, 개수(*), 최대(temp_lo)
    날씨로부터
    'S%'와 같은 도시 --(1)
    도시별로 그룹화;
도시 | 카운트 | 최대
---------------+---------+-----
 샌프란시스코 |     2 |  46
(1행)

(1)

좋아요연산자는 패턴 일치를 수행하며 이에 대한 설명은스포츠 토토 베트맨 PostgreSQL : 문서 : 13 : 9.7. 패턴 매칭.

젠 토토와 젠 토토 간의 상호 작용을 이해하는 것이 중요합니다.SQL's어디그리고가지고 있는 중절. 의 근본적인 차이점어디그리고가지고 있는 중이것은:어디그룹 및 젠 토토가 계산되기 전에 입력 행을 선택합니다(따라서 젠 토토 계산에 들어갈 행을 제어함).가지고 있는 중그룹 및 젠 토토가 계산된 후 그룹 행을 선택합니다. 따라서,어디절에는 젠 토토 함수가 포함되어서는 안 됩니다. 집계를 사용하여 집계에 대한 입력이 될 행을 결정하는 것은 의미가 없습니다. 반면에가지고 있는 중절에는 항상 젠 토토 함수가 포함됩니다. (엄밀히 말하면 다음과 같이 작성할 수 있습니다.가지고 있는 중집계를 사용하지 않는 절이지만 거의 유용하지 않습니다. 동일한 조건이 다음에서 더 효율적으로 사용될 수 있습니다.어디에서단계.)

이전 예에서는 도시 이름 제한을 다음과 같이 적용할 수 있습니다.어디, 집계가 필요하지 않기 때문입니다. 이는 다음에 제한을 추가하는 것보다 더 효율적입니다.가지고 있는 중, 실패한 모든 행에 대해 그룹화 및 젠 토토 계산을 수행하지 않기 때문입니다.어디확인.

집계 계산에 들어갈 행을 선택하는 또 다른 방법은 다음을 사용하는 것입니다.필터, 이는 젠 토토별 옵션입니다.

SELECT 도시, 개수(*) FILTER (WHERE temp_lo < 45), max(temp_lo)
    날씨로부터
    도시별로 그룹화;
도시 | 카운트 | 최대
---------------+---------+-----
 헤이워드 |     1 |  37
 샌프란시스코 |     1 |  46
(2행)

필터거의 비슷함어디에서, 단, 연결된 특정 젠 토토 함수의 입력에서만 행을 제거한다는 점은 다릅니다. 여기서는개수집계는 다음이 포함된 행만 계산합니다.temp_lo45 미만; 하지만최대젠 토토는 여전히 모든 행에 적용되므로 여전히 46의 판독값을 찾습니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.