> 데이터 베이스 > MySQL 튜토리얼 > CASE 문, FILTER 또는 Crosstab()을 사용하여 PostgreSQL에서 조건부 계산을 효율적으로 수행하는 방법은 무엇입니까?

CASE 문, FILTER 또는 Crosstab()을 사용하여 PostgreSQL에서 조건부 계산을 효율적으로 수행하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-24 06:16:13
원래의
119명이 탐색했습니다.

How to Efficiently Perform Conditional Counts in PostgreSQL Using CASE Statements, FILTER, or Crosstab()?

PostgreSQL 조건 계산: CASE 문과 FILTER의 효율성 비교

효율적인 통계표에서는 데이터 발생 빈도가 중요합니다. PostgreSQL에서는 조건 계산을 위해 CASE 문을 주로 사용하는데, 이 방법은 가능한 값의 개수가 많아질수록 번거로워진다.

계산에 SUM(CASE WHEN) 사용:

<code class="language-sql">SELECT
    sum(CASE WHEN question1 = 0 THEN 1 ELSE 0 END) AS ZERO,
    sum(CASE WHEN question1 = 1 THEN 1 ELSE 0 END) AS ONE,
    sum(CASE WHEN question1 = 2 THEN 1 ELSE 0 END) AS TWO,
    category
FROM reviews
GROUP BY category</code>
로그인 후 복사

계산하려면 COUNT(CASE WHEN)를 사용하세요.

<code class="language-sql">SELECT
    count(CASE WHEN question1 = 0 THEN 1 END) AS ZERO,
    count(CASE WHEN question1 = 1 THEN 1 END) AS ONE,
    count(CASE WHEN question1 = 2 THEN 1 END) AS TWO,
    category
FROM reviews
GROUP BY category</code>
로그인 후 복사

CASE 문의 제한 사항:

이러한 방법은 조건부 계산을 구현할 수 있지만 다음과 같은 단점이 있습니다.

  • 긴 코드: CASE 문을 여러 개 작성하면 오류가 발생하기 쉽고 비효율적입니다.
  • 성능 문제: CASE 표현식과 ELSE 0을 사용하면 성능에 영향을 미칠 수 있습니다.

FILTER를 사용하여 PostgreSQL 9.4 버전에서 계산 최적화:

PostgreSQL 9.4 이상의 경우 FILTER 집계 옵션이 효율적인 솔루션을 제공합니다.

<code class="language-sql">SELECT category
     , count(*) FILTER (WHERE question1 = 0) AS zero
     , count(*) FILTER (WHERE question1 = 1) AS one
     , count(*) FILTER (WHERE question1 = 2) AS two
FROM   reviews
GROUP  BY 1;</code>
로그인 후 복사

이 방법은 FILTER 절을 사용하여 다양한 필터를 적용함으로써 추가 CASE 문의 오버헤드를 방지합니다.

OR NULL을 사용하여 구문을 단순화하세요.

더 간결하게 하려면 OR NULL을 사용할 수 있습니다.

<code class="language-sql">SELECT category
     , count(question1 = 0 OR NULL) AS zero
     , count(question1 = 1 OR NULL) AS one
     , count(question1 = 2 OR NULL) AS two
FROM   reviews
GROUP  BY 1;</code>
로그인 후 복사

복합 개수에 대한 크로스탭 쿼리:

crosstab() 함수는 많은 수의 옵션을 처리할 때 최고의 성능과 단순성을 제공합니다.

<code class="language-sql">SELECT * FROM crosstab(
     'SELECT category, question1, count(*) AS ct
      FROM   reviews
      GROUP  BY 1, 2
      ORDER  BY 1, 2'
   , 'VALUES (0), (1), (2)'
   ) AS ct (category text, zero int, one int, two int);</code>
로그인 후 복사

요컨대 PostgreSQL의 FILTER 옵션과 OR NULL 구문은 조건 계산에 효율적이고 편리한 방법을 제공하며, crosstab() 함수는 복잡한 계산 시나리오에서 잘 작동합니다.

위 내용은 CASE 문, FILTER 또는 Crosstab()을 사용하여 PostgreSQL에서 조건부 계산을 효율적으로 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿