カテゴリ:

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