카테고리:

집계 함수 (General) , 윈도우 함수

COUNT

지정된 열에 대한 NULL이 아닌 레코드 수 또는 총 레코드 수를 반환합니다.

참고 항목:

COUNT_IF, MAX, MIN , SUM

구문

집계 함수

COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] )

COUNT(*)

COUNT(<alias>.*)
Copy

윈도우 함수

COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] ) OVER (
                                                     [ PARTITION BY <expr3> ]
                                                     [ ORDER BY <expr4> [ ASC | DESC ] [ <window_frame> ] ]
                                                     )
Copy

자세한 window_frame 구문은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.

인자

expr1

정규화된 이름일 수 있는 열 이름(예: 데이터베이스.스키마.테이블.열_이름).

expr2

원하는 경우 추가 열 이름을 포함할 수 있습니다. 예를 들어, 성 및 이름의 고유한 조합 수를 셀 수 있습니다.

expr3

결과를 여러 윈도우로 분할하려는 경우 분할할 열입니다.

expr4

각 윈도우를 정렬할 열입니다. 이는 최종 결과 세트를 정렬하기 위한 모든 ORDER BY 절과는 별개입니다.

*

총 레코드 수를 반환합니다.

함수에 와일드카드를 전달할 때 와일드카드를 테이블의 이름이나 별칭으로 한정할 수 있습니다. 예를 들어, mytable 이라는 테이블의 모든 열을 전달하려면 다음을 지정하십시오.

(mytable.*)
Copy

필터링을 위해 ILIKE 및 EXCLUDE 키워드를 사용할 수도 있습니다.

  • ILIKE는 지정된 패턴과 일치하는 열 이름을 필터링합니다. 패턴은 하나만 허용됩니다. 예:

    (* ILIKE 'col1%')
    
    Copy
  • EXCLUDE는 지정된 열과 일치하지 않는 열 이름을 걸러냅니다. 예:

    (* EXCLUDE col1)
    
    (* EXCLUDE (col1, col2))
    
    Copy

이러한 키워드를 사용할 경우 한정자가 유효합니다. 다음 예에서는 ILIKE 키워드를 사용하여 테이블 mytable 의 패턴 col1% 와 일치하는 모든 열을 필터링합니다.

(mytable.* ILIKE 'col1%')
Copy

ILIKE 및 EXCLUDE 키워드는 단일 함수 호출에서 결합할 수 없습니다.

정규화되지 않고 필터링되지 않은 와일드카드(*)를 지정하는 경우 이 함수는 NULL 값을 가진 레코드를 포함하여 총 레코드 수를 반환합니다.

필터링을 위해 ILIKE 또는 EXCLUDE 키워드와 함께 와일드카드를 지정하는 경우 이 함수는 NULL 값을 가진 레코드를 제외합니다.

이 함수의 경우 ILIKE 및 EXCLUDE 키워드는 SELECT 목록이나 GROUP BY 절에서만 유효합니다.

ILIKE 및 EXCLUDE 키워드에 대한 자세한 내용은 SELECT 의 “매개 변수” 섹션을 참조하십시오.

alias.*

NULL 값을 포함하지 않은 레코드 수를 반환합니다. 예를 보려면 예제 를 참조하십시오.

반환

NUMBER 형식의 값을 반환합니다.

사용법 노트

  • 이 함수는 JSON null (VARIANT NULL)을 SQL NULL로 취급합니다.

  • NULL 값 및 집계 함수에 대한 자세한 내용은 집계 함수 및 NULL 값 을 참조하십시오.

  • 이 함수가 집계 함수로 호출될 때:

    • DISTINCT 키워드를 사용하면 모든 열에 적용됩니다. 예를 들어, DISTINCT col1, col2, col3col1, col2col3 열의 서로 다른 조합 수를 반환함을 의미합니다. 예를 들어, 데이터가 다음과 같다고 가정해 보겠습니다.

      1, 1, 1
      1, 1, 1
      1, 1, 1
      1, 1, 2
      
      Copy

      이 경우 함수는 2 를 반환하는데, 이 값이 세 열에 있는 값으로 구성된 고유한 조합의 개수이기 때문입니다.

  • 이 함수가 ORDER BY 절을 포함하는 OVER 절이 있는 윈도우 함수로 호출되는 경우:

    • 윈도우 프레임이 필수입니다. 윈도우 프레임이 명시적으로 지정되지 않으면 다음과 같은 암시적 윈도우 프레임이 사용됩니다.

      RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

      구문, 사용법 노트, 예를 포함하여 윈도우 프레임에 대한 자세한 내용은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.

    • 윈도우 함수에서 DISTINCT 키워드를 사용하는 것은 금지되며 컴파일 시간 오류가 발생합니다.

  • 조건과 일치하는 행의 수를 반환하려면 COUNT_IF 를 사용합니다.

  • 가능하면 행 액세스 정책 없이 테이블과 뷰에 COUNT 함수를 사용합니다. 이 함수를 사용하는 쿼리는 행 액세스 정책이 없는 테이블 또는 뷰에서 더 빠르고 정확합니다. 성능 차이의 이유는 다음과 같습니다.

    • Snowflake는 테이블 및 뷰에 대한 통계를 유지 관리하며, 이러한 최적화를 통해 간단한 쿼리를 더 빠르게 실행할 수 있습니다.

    • 행 액세스 정책이 테이블 또는 뷰에 설정되고 COUNT 함수가 쿼리에 사용되는 경우, Snowflake는 각 행을 스캔하여, 사용자가 행을 볼 수 있는지 여부를 확인해야 합니다.

다음 예에서는 NULL 값이 있는 데이터에 COUNT 함수를 사용합니다.

테이블을 만들고 값을 삽입합니다.

CREATE TABLE basic_example (i_col INTEGER, j_col INTEGER);
INSERT INTO basic_example VALUES
    (11,101), (11,102), (11,NULL), (12,101), (NULL,101), (NULL,102);
Copy

테이블을 쿼리합니다.

SELECT *
    FROM basic_example
    ORDER BY i_col;
Copy
+-------+-------+
| I_COL | J_COL |
|-------+-------|
|    11 |   101 |
|    11 |   102 |
|    11 |  NULL |
|    12 |   101 |
|  NULL |   101 |
|  NULL |   102 |
+-------+-------+
SELECT COUNT(*) AS "All",
       COUNT(* ILIKE 'i_c%') AS "ILIKE",
       COUNT(* EXCLUDE i_col) AS "EXCLUDE",
       COUNT(i_col) AS "i_col", 
       COUNT(DISTINCT i_col) AS "DISTINCT i_col", 
       COUNT(j_col) AS "j_col", 
       COUNT(DISTINCT j_col) AS "DISTINCT j_col"
  FROM basic_example;
Copy
+-----+-------+---------+-------+----------------+-------+----------------+
| All | ILIKE | EXCLUDE | i_col | DISTINCT i_col | j_col | DISTINCT j_col |
|-----+-------+---------+-------+----------------+-------+----------------|
|   6 |     4 |       5 |     4 |              2 |     5 |              2 |
+-----+-------+---------+-------+----------------+-------+----------------+

이 출력의 All 열은 COUNT에 대해 정규화되지 않고 필터링되지 않은 와일드카드가 지정되는 경우 함수가 NULL 값이 있는 행을 포함하여 테이블의 총 행 수를 반환한다는 점을 보여줍니다. 출력의 다른 열은 필터링이 적용된 열이나 와일드카드가 지정될 경우 함수가 NULL 값이 있는 행을 제외한다는 점을 보여줍니다.

다음 쿼리에서는 GROUP BY 절과 함께 COUNT 함수를 사용합니다.

SELECT i_col, COUNT(*), COUNT(j_col)
    FROM basic_example
    GROUP BY i_col
    ORDER BY i_col;
Copy
+-------+----------+--------------+
| I_COL | COUNT(*) | COUNT(J_COL) |
|-------+----------+--------------|
|    11 |        3 |            2 |
|    12 |        1 |            1 |
|  NULL |        2 |            2 |
+-------+----------+--------------+

다음 예는 COUNT(alias.*) 가 NULL 값을 포함하지 않는 행의 수를 반환함을 보여줍니다. basic_example 테이블에는 총 6개의 행이 있지만, 3개의 행에는 하나 이상의 NULL 값이 있고 다른 3개의 행에는 NULL 값이 없습니다.

SELECT COUNT(n.*) FROM basic_example AS n;
Copy
+------------+
| COUNT(N.*) |
|------------|
|          3 |
+------------+

다음 예는 JSON null (VARIANT NULL)이 COUNT 함수에 의해 SQL NULL로 처리됨을 보여줍니다.

테이블을 만들고 SQL NULL 및 JSON null 값을 모두 포함하는 데이터를 삽입합니다.

CREATE OR REPLACE TABLE count_example_with_variant_column (
  i_col INTEGER, 
  j_col INTEGER, 
  v VARIANT);
Copy
BEGIN WORK;

INSERT INTO count_example_with_variant_column (i_col, j_col, v) 
  VALUES (NULL, 10, NULL);
INSERT INTO count_example_with_variant_column (i_col, j_col, v) 
  SELECT 1, 11, PARSE_JSON('{"Title": null}');
INSERT INTO count_example_with_variant_column (i_col, j_col, v) 
  SELECT 2, 12, PARSE_JSON('{"Title": "O"}');
INSERT INTO count_example_with_variant_column (i_col, j_col, v) 
  SELECT 3, 12, PARSE_JSON('{"Title": "I"}');

COMMIT WORK;
Copy

이 SQL 코드에서 다음 사항에 유의하십시오.

  • 첫 번째 INSERT INTO 문은 VARIANT 열과 VARIANT가 아닌 열 모두에 SQL NULL을 삽입합니다.

  • 두 번째 INSERT INTO 문은 JSON null(VARIANT NULL)을 삽입합니다.

  • 마지막 두 INSERT INTO 문은 NULL VARIANT가 아닌 값을 삽입합니다.

데이터를 표시합니다.

SELECT i_col, j_col, v, v:Title
    FROM count_example_with_variant_column
    ORDER BY i_col;
Copy
+-------+-------+-----------------+---------+
| I_COL | J_COL | V               | V:TITLE |
|-------+-------+-----------------+---------|
|     1 |    11 | {               | null    |
|       |       |   "Title": null |         |
|       |       | }               |         |
|     2 |    12 | {               | "O"     |
|       |       |   "Title": "O"  |         |
|       |       | }               |         |
|     3 |    12 | {               | "I"     |
|       |       |   "Title": "I"  |         |
|       |       | }               |         |
|  NULL |    10 | NULL            | NULL    |
+-------+-------+-----------------+---------+

COUNT 함수가 NULL 및 JSON null(VARIANT NULL) 값을 모두 NULL로 취급함을 보여줍니다. 테이블에 4개의 행이 있습니다. 하나에는 SQL NULL이 있고 다른 하나에는 JSON null이 있습니다. 두 행 모두 개수에서 제외되므로 개수는 2 입니다.

SELECT COUNT(v:Title)
    FROM count_example_with_variant_column;
Copy
+----------------+
| COUNT(V:TITLE) |
|----------------|
|              2 |
+----------------+