카테고리:

집계 함수 (일반) , 윈도우 함수 (일반, 윈도우 프레임)

COUNT

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

참고 항목:

COUNT_IF, MAX, MIN , SUM

구문

집계 함수

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

COUNT( * )
Copy

윈도우 함수

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

window_frame 구문에 대한 자세한 내용은 윈도우 프레임 구문과 사용법 을 참조하십시오.

인자

expr1

다음 중 하나여야 합니다.

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

  • 함수가 NULL을 포함하지 않는 행의 수를 반환해야 함을 나타내는 Alias.*. 예를 보려면 를 참조하십시오.

expr2

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

expr3

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

expr4

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

사용법 노트

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

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

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

    • DISTINCT 키워드를 사용하면 모든 열에 적용됩니다. 예를 들어, DISTINCT col1, col2, col3 은 col1, col2, col3 열의 서로 다른 조합 수를 반환함을 의미합니다. 예를 들어, 데이터가 다음과 같은 경우:

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

      함수는 2를 반환합니다. 3개의 열에 있는 값의 고유한 조합의 수이기 때문입니다.

  • 이 함수가 윈도우 함수(즉, OVER 절 포함)로 호출될 때:

    • OVER 절에 ORDER BY 하위 절이 포함된 경우:

      • 윈도우 프레임이 필수입니다. 윈도우 프레임이 명시적으로 지정되지 않은 경우, ORDER BY는 누적 윈도우 프레임을 의미합니다.

        RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

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

        암시적 윈도우 프레임에 대한 내용은 윈도우 프레임 사용법 노트 섹션을 참조하십시오.

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

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

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

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

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

이는 NULL 값으로 COUNT 를 사용하는 예입니다. 쿼리에는 일부 COUNT(DISTINCT) 작업도 포함됩니다.

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(*), COUNT(i_col), COUNT(DISTINCT i_col), COUNT(j_col), COUNT(DISTINCT j_col) FROM basic_example;
Copy
+----------+--------------+-----------------------+--------------+-----------------------+
| COUNT(*) | COUNT(I_COL) | COUNT(DISTINCT I_COL) | COUNT(J_COL) | COUNT(DISTINCT J_COL) |
|----------+--------------+-----------------------+--------------+-----------------------|
|        6 |            4 |                     2 |            5 |                     2 |
+----------+--------------+-----------------------+--------------+-----------------------+
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 값을 포함하지 않는 행의 수를 반환함을 보여줍니다.

다음과 같은 데이터 세트를 만듭니다.

  • 1개의 행에는 모두 null이 있습니다.

  • 2개의 행에는 정확히 하나의 null이 있습니다.

  • 3개의 행에는 하나 이상의 null이 있습니다.

  • 총 4개의 NULL 값이 있습니다.

  • 5개의 행에는 null이 없습니다.

  • 총 8개의 행이 있습니다.

CREATE TABLE non_null_counter(col1 INTEGER, col2 INTEGER);
INSERT INTO non_null_counter(col1, col2) VALUES
    (NULL, NULL),   -- all NULL values
    (NULL, 1),      -- one NULL value
    (1, NULL),      -- one NULL value
    (1, 1),
    (2, 2),
    (3, 3),
    (4, 4),
    (5, 5);
Copy

쿼리는 NULL 값을 포함하지 않는 행의 수인 개수 5를 반환합니다.

SELECT COUNT(n.*)
    FROM non_null_counter AS n;
Copy
+------------+
| COUNT(N.*) |
|------------|
|          5 |
+------------+

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

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

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

-- SQL NULL for both a VARIANT column and a non-VARIANT column.
INSERT INTO count_example_with_variant_column (i_col, j_col, v) VALUES (NULL, 10, NULL);
-- VARIANT NULL (aka JSON null)
INSERT INTO count_example_with_variant_column (i_col, j_col, v) SELECT 1, 11, PARSE_JSON('{"Title": null}');
-- VARIANT NON-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

데이터를 표시합니다.

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

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