テーブル関数

テーブル関数は、入力行ごとに行のセットを返します。返されるセットには、0行、1行、またはそれ以上の行を含めることができます。各行には、1つ以上の列を含めることができます。

テーブル関数は、「表形式関数」と呼ばれることがあります。

このトピックの内容:

テーブル関数とは

テーブル関数は通常、関数が個々の入力ごとに複数の行を返す場合に使用されます。

テーブル関数が呼び出されるたびに、異なる数の行を返すことができます。たとえば、指定された日付の記録的な高温のリストを返す関数 record_high_temperatures_for_date() は、4月10日に0行、6月10日に1行、そして8月20日に40行を返す場合があります。

テーブル関数の簡単な例

次は、テーブル関数として適切です。

  • アカウント番号と日付を受け取り、その日にそのアカウントに請求されたすべての料金を返す関数。(特定の日に複数の料金が請求されている可能性があります。)

  • ユーザー ID を受け入れ、そのユーザーに割り当てられたデータベースロールを返す関数。(ユーザーには、「sysadmin」や「useradmin」などの複数のロールがある場合があります。)

各出力行が複数の入力行に依存する関数

テーブル関数は、各出力行に影響を与える入力行の数に基づいて、2つのカテゴリにグループ化できます。

  • 1-to-N

  • M-to-N

前述の関数は1-to-Nのテーブル関数です。各出力行は1つの入力行のみに依存します。たとえば、関数 record_high_temperatures_for_date() は、複数の出力行を生成する場合があります(その日に記録にヒットした都市ごとに1つ)。特定の入力日付の各出力行は、その日付のみに依存します。各出力行は、1日おきの行から独立しています。

Snowflakeは、M-to-Nのテーブル関数もサポートしています。各出力行は複数の入力行に依存できます。たとえば、関数が株価の移動平均を生成する場合、その関数は複数の入力行(複数の日付)からの株価を使用して各出力行を生成します。

一般的に、M-to-N の関数では、M個の入力行のグループがN個の出力行のグループを生成します。Mは1つ以上の行にすることができます。Nは0行、1行、またはそれ以上の行にすることができます。

たとえば、10日移動平均では、Mは10です。入力10行ずつの各グループが1つの平均価格を生成するため、Nは1です。

組み込みのテーブル関数とユーザー定義のテーブル関数

Snowflakeには何百もの組み込み関数があり、その多くはテーブル関数です。組み込みのテーブル関数は システム定義のテーブル関数 にリストされています。

ユーザーは、ユーザー定義の関数または「UDFs」と呼ばれる独自の関数を記述することもできます。一部の UDFs はスカラーです。いくつかは表形式です。ユーザー定義のテーブル関数は「UDTFs」と呼ばれます。UDFs (UDTFs を含む)については、 ユーザー定義関数の概要 をご参照ください。

組み込みのテーブル関数とユーザー定義のテーブル関数は、通常、同じルールに従います。たとえば、 SQL ステートメントから同じように呼び出されます。

テーブル関数の使用

FROM 句でのテーブル関数の使用

テーブルには行のセットが含まれています。同様に、テーブル関数は行のセットを返します。テーブルとテーブル関数の両方が、行のセットを期待するコンテキストで使用されます。具体的には、テーブル関数は SQL ステートメントの FROM 句で使用されます。

SQL コンパイラがテーブル関数を行のソースとして認識できるようにするために、Snowflakeではテーブル関数の呼び出しを TABLE() キーワードでラップする必要があります。

たとえば、次のステートメントは、引数として DATE 値をとる record_high_temperatures_for_date() という名前のテーブル関数を呼び出します。

SELECT city_name, temperature
    FROM TABLE(record_high_temperatures_for_date('2021-06-27'::DATE))
    ORDER BY city_name;
Copy

TABLE() の構文の詳細については、 テーブルリテラル をご参照ください。

一般的な関数と同様に、テーブル関数は、各呼び出しで0、1つ、または複数の入力引数を受け入れることができます。各引数はスカラー式である必要があります。

テーブル関数呼び出しの構文の詳細については、 構文 (このトピック内)をご参照ください。

テーブル関数への入力としてテーブルを使用

テーブル関数の引数は、リテラルまたはテーブルの列などの式にすることができます。たとえば、以下の SELECT ステートメントは、テーブルからの値を引数としてテーブル関数に渡します。

CREATE OR REPLACE table dates_of_interest (event_date DATE);
INSERT INTO dates_of_interest (event_date) VALUES
    ('2021-06-21'::DATE),
    ('2022-06-21'::DATE);

CREATE OR REPLACE FUNCTION record_high_temperatures_for_date(d DATE)
    RETURNS TABLE (event_date DATE, city VARCHAR, temperature NUMBER)
    as
    $$
    SELECT d, 'New York', 65.0
    UNION ALL
    SELECT d, 'Los Angeles', 69.0
    $$;
Copy
SELECT
        doi.event_date as "Date", 
        record_temperatures.city,
        record_temperatures.temperature
    FROM dates_of_interest AS doi,
         TABLE(record_high_temperatures_for_date(doi.event_date)) AS record_temperatures
      ORDER BY doi.event_date, city;
+------------+-------------+-------------+
| Date       | CITY        | TEMPERATURE |
|------------+-------------+-------------|
| 2021-06-21 | Los Angeles |          69 |
| 2021-06-21 | New York    |          65 |
| 2022-06-21 | Los Angeles |          69 |
| 2022-06-21 | New York    |          65 |
+------------+-------------+-------------+
Copy

テーブル関数の引数は、ビューや他のテーブル関数など、他のテーブルのようなソースから取得できます。

システム定義のテーブル関数のリスト

Snowflakeは、次のシステム定義(つまり、組み込み)のテーブル関数を提供します。

サブカテゴリ

関数

メモ

データのロード

INFER_SCHEMA

詳細については、 Snowflakeにデータをロードする をご参照ください。

VALIDATE

データ生成

GENERATOR

データ変換

SPLIT_TO_TABLE

STRTOK_SPLIT_TO_TABLE

ML 駆動型分析

TOP_INSIGHTS

詳細については、 Snowflake Cortex ML ベースの関数 をご参照ください。

オブジェクトモデリング

GET_OBJECT_REFERENCES

半構造化クエリ

FLATTEN

詳細については、 半構造化データのクエリ をご参照ください。

クエリ結果

RESULT_SCAN

別の SQL 操作からの出力に対して SQL 操作を実行するために使用できます(例: SHOW)

クエリプロファイル

GET_QUERY_OPERATOR_STATS

履歴と使用情報

Snowflake Information SchemaAccount Usage):

ユーザーログイン

LOGIN_HISTORY , LOGIN_HISTORY_BY_USER

クエリ

QUERY_HISTORY , QUERY_HISTORY_BY_*

QUERY_ACCELERATION_HISTORY

詳細については、 Query Acceleration Serviceの使用 をご参照ください。

ウェアハウスとストレージの使用

DATABASE_STORAGE_USAGE_HISTORY

WAREHOUSE_LOAD_HISTORY

WAREHOUSE_METERING_HISTORY

STAGE_STORAGE_USAGE_HISTORY

列レベルと行レベルのセキュリティ

POLICY_REFERENCES

オブジェクトのタグ付け

TAG_REFERENCES

Information Schemaテーブル関数。

TAG_REFERENCES_ALL_COLUMNS

Information Schemaテーブル関数。

TAG_REFERENCES_WITH_LINEAGE

Account Usageテーブル関数。

アカウント複製

REPLICATION_GROUP_REFRESH_HISTORY

詳細については、 複数のアカウント間にわたる複製とフェールオーバーの概要 をご参照ください

REPLICATION_GROUP_REFRESH_PROGRESS, REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB

REPLICATION_GROUP_USAGE_HISTORY

データベースの複製

DATABASE_REFRESH_HISTORY

詳細については、 複数のアカウント間でのデータベースの複製 をご参照ください。

DATABASE_REFRESH_PROGRESS , DATABASE_REFRESH_PROGRESS_BY_JOB

DATABASE_REPLICATION_USAGE_HISTORY

データのロードおよび転送

COPY_HISTORY

DATA_TRANSFER_HISTORY

PIPE_USAGE_HISTORY

STAGE_DIRECTORY_FILE_REGISTRATION_HISTORY

VALIDATE_PIPE_LOAD

データクラスタリング(テーブル内)

AUTOMATIC_CLUSTERING_HISTORY

詳細については、 自動クラスタリング をご参照ください。

動的テーブル

DYNAMIC_TABLE_GRAPH_HISTORY

詳細については、 動的テーブルの操作について をご参照ください。

DYNAMIC_TABLE_REFRESH_HISTORY

外部関数

EXTERNAL_FUNCTIONS_HISTORY

詳細については、 外部関数の記述 をご参照ください。

外部テーブル

AUTO_REFRESH_REGISTRATION_HISTORY

詳細については、 外部テーブルの使用 をご参照ください。

EXTERNAL_TABLE_FILES

EXTERNAL_TABLE_FILE_REGISTRATION_HISTORY

マテリアライズドビューのメンテナンス

MATERIALIZED_VIEW_REFRESH_HISTORY

詳細については、 マテリアライズドビューの使用 をご参照ください。

通知

NOTIFICATION_HISTORY

詳細については、 メール通知の送信 をご参照ください。

SCIM のメンテナンス

REST_EVENT_HISTORY

詳細については、 SCIM を使用した監査 をご参照ください

検索最適化のメンテナンス

SEARCH_OPTIMIZATION_HISTORY

詳細については、 検索最適化サービス をご参照ください。

ストリーム

SYSTEM$STREAM_BACKLOG

詳細については、 テーブルストリームを使用した変更追跡 をご参照ください。

タスク

COMPLETE_TASK_GRAPHS

詳細については、 タスクを使用したスケジュールでの SQL ステートメントの実行 をご参照ください。

CURRENT_TASK_GRAPHS

SERVERLESS_TASK_HISTORY

TASK_DEPENDENTS

TASK_HISTORY

構文

SELECT ...
  FROM [ <input_table> [ [AS] <alias_1> ] ,
         [ LATERAL ]
       ]
       TABLE( <table_function>( [ <arg_1> [, ... ] ] ) ) [ [ AS ] <alias_2> ];
Copy

関数固有の構文については、システム定義のテーブル関数個別のドキュメントをご参照ください。

使用上の注意

  • テーブル関数は、 LATERAL 構造を使用して行のセットに適用することもできます。

  • テーブル式の使用を有効にするために、Snowflakeは、クエリおよびサブクエリの FROM 句でテーブル式の ANSI/ISO 標準構文をサポートします。この構文は、式が単一の行ではなく行のコレクションを返すことを示すために使用されます。

  • この ANSI/ISO 構文は、 SELECT リストの FROM 句のみで有効です。他のコンテキストでは、コレクションサブクエリの仕様からこれらのキーワードと括弧を省略できません。