カテゴリ:

集計関数 (一般)、 ウィンドウ関数 (一般、ウィンドウフレーム)

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

これは次のいずれかになります。

  • 修飾名にもなりうる、列名(例:database.schema.table.column_name)。

  • NULLsを含まない行の数を返す必要があることを示す Alias.* 関数。例については、 をご参照ください。

expr2

必要に応じて、追加の列名を含めることができます。例えば、姓と名の異なる組み合わせの数をカウントできます。

expr3

結果を複数のウィンドウに分割する場合、パーティション化する列です。

expr4

各ウィンドウを並べ替える列です。これは、最終結果セットを順序付けるための ORDER BY 句とは別のものです。

使用上の注意

  • この関数は、 VARIANT NULL (JSON null)を 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

      関数は3列の値の異なる組み合わせの数であるため、2を返します。

  • この関数がウィンドウ関数(つまり、 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が1つだけあります。

  • 3行に少なくとも1つの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)の値の両方を NULLs として扱うことを示します。テーブルには4行あります。1つには SQL NULL があり、もう1つには VARIANT NULL があります。これらの行は両方ともカウントから除外されるため、カウントは2になります。

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