テーブル関数¶
テーブル関数は、入力行ごとに行のセットを返します。返されるセットには、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;
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
$$;
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 |
+------------+-------------+-------------+
テーブル関数の引数は、ビューや他のテーブル関数など、他のテーブルのようなソースから取得できます。
システム定義のテーブル関数のリスト¶
Snowflakeは、次のシステム定義(つまり、組み込み)のテーブル関数を提供します。
サブカテゴリ |
関数 |
メモ |
---|---|---|
データのロード |
詳細については、 Snowflakeにデータをロードする をご参照ください。 |
|
データ生成 |
||
データ変換 |
||
ML 駆動型分析 |
詳細については、 Snowflake Cortex ML 駆動型機能 をご参照ください。 |
|
オブジェクトモデリング |
||
半構造化クエリ |
詳細については、 半構造化データのクエリ をご参照ください。 |
|
クエリ結果 |
別の SQL 操作からの出力に対して SQL 操作を実行するために使用できます(例: SHOW) |
|
クエリプロファイル |
||
履歴と使用情報 |
||
ユーザーログイン
|
||
クエリ
|
||
詳細については、 Query Acceleration Serviceの使用 をご参照ください。 |
||
ウェアハウスとストレージの使用
|
||
列レベルと行レベルのセキュリティ
|
||
オブジェクトのタグ付け
|
Information Schemaテーブル関数。 |
|
Information Schemaテーブル関数。 |
||
Account Usageテーブル関数。 |
||
アカウント複製
|
詳細については、 複数のアカウント間にわたる複製とフェールオーバーの概要 をご参照ください |
|
REPLICATION_GROUP_REFRESH_PROGRESS, REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB |
||
データベースの複製
|
詳細については、 複数のアカウント間でのデータベースの複製 をご参照ください。 |
|
DATABASE_REFRESH_PROGRESS , DATABASE_REFRESH_PROGRESS_BY_JOB |
||
データのロードおよび転送
|
||
データクラスタリング(テーブル内)
|
詳細については、 自動クラスタリング をご参照ください。 |
|
動的テーブル
|
詳細については、 動的テーブルの操作について をご参照ください。 |
|
外部関数
|
詳細については、 外部関数の記述 をご参照ください。 |
|
外部テーブル
|
詳細については、 外部テーブルの使用 をご参照ください。 |
|
マテリアライズドビューのメンテナンス
|
詳細については、 マテリアライズドビューの使用 をご参照ください。 |
|
通知
|
詳細については、 メール通知の送信 をご参照ください。 |
|
SCIM のメンテナンス
|
詳細については、 SCIM を使用した監査 をご参照ください |
|
検索最適化のメンテナンス
|
詳細については、 検索最適化サービス をご参照ください。 |
|
ストリーム
|
詳細については、 テーブルストリームを使用した変更追跡 をご参照ください。 |
|
タスク
|
詳細については、 タスクを使用したスケジュールでの SQL ステートメントの実行 をご参照ください。 |
|
ネットワークルール |
Information Schemaテーブル関数。詳細については、 ネットワークルール をご参照ください。 |
構文¶
SELECT ...
FROM [ <input_table> [ [AS] <alias_1> ] ,
[ LATERAL ]
]
TABLE( <table_function>( [ <arg_1> [, ... ] ] ) ) [ [ AS ] <alias_2> ];
関数固有の構文については、システム定義のテーブル関数個別のドキュメントをご参照ください。