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 |
+----------------+