COUNT¶
指定した列のNULL 以外のレコードの数、またはレコードの合計数を返します。
構文¶
集計関数
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] ) COUNT(*) COUNT(<alias>.*)
ウィンドウ関数
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] ) OVER ( [ PARTITION BY <expr3> ] [ ORDER BY <expr4> [ ASC | DESC ] [ <window_frame> ] ] )
window_frame
の構文の詳細については、 ウィンドウ関数の構文と使用法 をご参照ください。
引数¶
expr1
列名。修飾名にもできます(例: database.schema.table.column_name)。
expr2
必要に応じて、追加の列名を含めることができます。例えば、姓と名の異なる組み合わせの数をカウントできます。
expr3
結果を複数のウィンドウに分割する場合、パーティション化する列です。
expr4
各ウィンドウを並べ替える列です。これは、最終結果セットを順序付けるための ORDER BY 句とは別のものです。
*
記録の総数を返します。
関数にワイルドカードを渡す場合、ワイルドカードをテーブルの名前またはエイリアスで修飾することができます。例えば、
mytable
というテーブルからすべての列を渡すには、以下のように指定します。(mytable.*)
ILIKE と EXCLUDE キーワードを使ってフィルタリングすることもできます。
ILIKE は、指定されたパターンに一致する列名でフィルターします。許されるパターンは1つのみです。例:
(* ILIKE 'col1%')
EXCLUDE は、指定された列に一致しない列名をフィルターします。例:
(* EXCLUDE col1) (* EXCLUDE (col1, col2))
修飾子は、これらのキーワードを使用する場合に有効です。以下の例では、 ILIKE キーワードを使用して、テーブル
mytable
内のパターンcol1%
に一致するすべての列をフィルターします。(mytable.* ILIKE 'col1%')
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
は、列col1
、col2
、およびcol3
のさまざまな組み合わせの数を返すことを意味します。例えば、次のデータを想定します。1, 1, 1 1, 1, 1 1, 1, 1 1, 1, 2
この場合、関数は
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);
テーブルをクエリします。
SELECT * FROM basic_example ORDER BY i_col;
+-------+-------+ | 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;
+-----+-------+---------+-------+----------------+-------+----------------+ | 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;
+-------+----------+--------------+ | 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;
+------------+ | 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);
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;
この 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;
+-------+-------+-----------------+---------+ | 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;
+----------------+ | COUNT(V:TITLE) | |----------------| | 2 | +----------------+