COUNT¶
指定した列のNULL 以外のレコードの数、またはレコードの合計数を返します。
構文¶
集計関数
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] )
COUNT( * )
ウィンドウ関数
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] ) OVER (
[ PARTITION BY <expr3> ]
[ ORDER BY <expr4> [ ASC | DESC ] [ <window_frame> ] ]
)
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
関数は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);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(*), COUNT(i_col), COUNT(DISTINCT i_col), COUNT(j_col), COUNT(DISTINCT j_col) FROM basic_example;+----------+--------------+-----------------------+--------------+-----------------------+ | 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;+-------+----------+--------------+ | 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);クエリは、 NULL 値を含まない行の数である5のカウントを返します。
SELECT COUNT(n.*) FROM non_null_counter AS n;+------------+ | 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);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;データを表示します。
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 と VARIANT NULL (JSON null)の値の両方を NULLs として扱うことを示します。テーブルには4行あります。1つには SQL NULL があり、もう1つには VARIANT NULL があります。これらの行は両方ともカウントから除外されるため、カウントは2になります。SELECT COUNT(v:Title) FROM count_example_with_variant_column;+----------------+ | COUNT(V:TITLE) | |----------------| | 2 | +----------------+