カテゴリ:

集計関数 (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

列名。修飾名にもできます(例: database.schema.table.column_name)。

expr2

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

expr3

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

expr4

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

*

記録の総数を返します。

関数にワイルドカードを渡す場合、ワイルドカードをテーブルの名前またはエイリアスで修飾することができます。例えば、 mytable というテーブルからすべての列を渡すには、以下のように指定します。

(mytable.*) 
Copy

ILIKE と EXCLUDE キーワードを使ってフィルタリングすることもできます。

  • ILIKE は、指定されたパターンに一致する列名でフィルターします。許されるパターンは1つのみです。例:

    (* ILIKE 'col1%') 
    Copy
  • EXCLUDE は、指定された列に一致しない列名をフィルターします。例:

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

修飾子は、これらのキーワードを使用する場合に有効です。以下の例では、 ILIKE キーワードを使用して、テーブル mytable 内のパターン col1% に一致するすべての列をフィルターします。

(mytable.* ILIKE 'col1%') 
Copy

ILIKE と EXCLUDE キーワードは、1つの関数呼び出し内で組み合わせることはできません。

修飾もフィルターもされていないワイルドカード(*)を指定した場合、この関数は 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, col3 は、列 col1col2、および col3 のさまざまな組み合わせの数を返すことを意味します。例えば、次のデータを想定します。

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

      この場合、関数は 2 を返します。これは、3つの列の値の個別の異なる組み合わせの数です。

  • この関数が、 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 値を含む行を除外することを示しています。

次のクエリでは、 COUNT 関数を GROUP BY 句とともに使用しています。

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行には少なくとも1つの 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 を挿入します。

  • 2番目の INSERT INTO ステートメントは、 JSON null(VARIANT NULL)を挿入します。

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

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