Tabellenfunktionen

Eine Tabellenfunktion gibt für jede Eingabezeile eine Menge von Zeilen zurück. Die zurückgegebene Menge kann null, eine oder mehrere Zeilen enthalten. Jede zurückgegebene Zeile kann eine oder mehrere Spalten enthalten.

Tabellenfunktionen werden manchmal als „tabellarische Funktionen“ bezeichnet.

Unter diesem Thema:

Was sind Tabellenfunktionen?

Tabellenfunktionen werden normalerweise verwendet, wenn eine Funktion für eine einzelne Eingabe mehrere Zeilen zurückgibt.

Jedes Mal, wenn eine Tabellenfunktion aufgerufen wird, kann sie eine andere Anzahl von Zeilen zurückgeben. Die Funktion record_high_temperatures_for_date(), die eine Liste der Rekordhöchsttemperaturen für ein bestimmtes Datum liefert, könnte zum Beispiel 0 Zeilen für den 10. April, 1 Zeile für den 10. Juni und 40 Zeilen für den 20. August zurückgeben.

Einfache Beispiele für Tabellenfunktionen

Folgende Funktionen wären beispielsweise als Tabellenfunktionen geeignet:

  • Eine Funktion, die eine Kontonummer und ein Datum akzeptiert und alle Gebühren zurückgibt, die diesem Konto an diesem Datum in Rechnung gestellt wurden. (Es kann sein, dass an einem bestimmten Datum mehr als eine Gebühr abgerechnet wurde).

  • Eine Funktion, die eine ID-Benutzer annimmt und die diesem Benutzer zugewiesenen Datenbankrollen zurückgibt. (Ein Benutzer kann mehrere Rollen haben, einschließlich „sysadmin“ und „useradmin“).

Funktionen, bei denen jede Ausgabezeile von mehreren Eingabezeilen abhängt

Tabellenfunktionen lassen sich nach der Anzahl der Eingabezeilen, die Auswirkungen auf jede Ausgabezeile haben, in zwei Kategorien unterteilen:

  • 1:N

  • M:N

Die zuvor beschriebenen Funktionen sind 1:N-Tabellenfunktionen: Jede Ausgabezeile hängt von nur einer Eingabezeile ab. Die Funktion record_high_temperatures_for_date() könnte zum Beispiel mehrere Ausgabezeilen erzeugen (eine für jede Stadt, für die zu diesem Datum ein Datensatz vorliegt). Jede Ausgabezeile für ein bestimmtes Eingabedatum hängt nur von diesem Datum ab, während jede Ausgabezeile unabhängig von den Zeilen für jedes andere Datum ist.

Snowflake unterstützt auch M:N-Tabellenfunktionen: Jede Ausgabezeile kann von mehreren Eingabezeilen abhängen. Wenn beispielsweise eine Funktion einen gleitenden Durchschnitt von Aktienkursen generiert, verwendet diese Funktion Aktienkurse aus mehreren Eingabezeilen (mehrere Tage), um jede Ausgabezeile zu generieren.

Bei einer M:N-Funktion generiert eine Gruppe von M Eingabezeilen eine Gruppe von N Ausgabezeilen. M kann eine oder mehrere Zeilen sein. N kann null, eine oder mehrere Zeilen sein.

Bei einem gleitenden Durchschnitt von 10 Tagen ist M zum Beispiel 10. N ist 1, weil jede Gruppe von 10 Eingabezeilen einen Durchschnittspreis ergibt.

Integrierte Tabellenfunktionen vs. benutzerdefinierte Tabellenfunktionen

Snowflake bietet Hunderte von integrierten Funktionen, von denen viele Tabellenfunktionen sind. Integrierte Tabellenfunktionen sind unter Systemdefinierte Tabellenfunktionen aufgeführt.

Benutzer können auch ihre eigenen Funktionen schreiben, die so genannten benutzerdefinierten Funktionen oder UDFs (User-defined Functions). Einige UDFs sind skalar, andere sind tabellarisch. Benutzerdefinierte Tabellenfunktionen werden UDTFs (User-defined Table Functions) genannt. Weitere Informationen zu UDFs (einschließlich UDTFs) finden Sie unter UDFs (Benutzerdefinierte Funktionen).

Integrierte Tabellenfunktionen und benutzerdefinierte Tabellenfunktionen folgen im Allgemeinen den gleichen Regeln. So werden sie beispielsweise auf die gleiche Weise von SQL-Anweisungen aufgerufen.

Verwenden von Tabellenfunktionen

Verwenden einer Tabellenfunktion in der FROM-Klausel

Eine Tabelle enthält eine Menge von Zeilen. In ähnlicher Weise gibt eine Tabellenfunktion eine Menge von Zeilen zurück. Sowohl Tabellen als auch Tabellenfunktionen werden in Kontexten verwendet, die eine Menge von Zeilen erwarten. Insbesondere werden Tabellenfunktionen in der FROM-Klausel einer SQL-Anweisung verwendet.

Damit der SQL-Compiler eine Tabellenfunktion als Quelle von Zeilen erkennen kann, verlangt Snowflake, dass der Aufruf der Tabellenfunktion von Schlüsselwort TABLE() umschlossen wird.

Die folgende Anweisung ruft z. B. eine Tabellenfunktion namens record_high_temperatures_for_date() auf, die einen DATE-Wert als Argument erwartet:

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

Weitere Informationen zur Syntax von TABLE() finden Sie unter Tabellenliterale.

Tabellenfunktionen können, wie Funktionen im Allgemeinen, bei jedem Aufruf null, ein oder mehrere Eingabeargumente akzeptieren. Jedes Argument muss ein skalarer Ausdruck sein.

Weitere Informationen zur Syntax von Tabellenfunktionsaufrufen finden Sie unter Syntax (unter diesem Thema).

Verwenden einer Tabelle als Eingabe einer Tabellenfunktion

Das Argument einer Tabellenfunktion kann ein Literal oder ein Ausdruck sein, z. B. eine Spalte aus einer Tabelle. Die folgende SELECT-Anweisung übergibt beispielsweise Werte aus einer Tabelle als Argumente an eine Tabellenfunktion:

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

Die Argumente einer Tabellenfunktion können aus anderen tabellenähnlichen Quellen stammen, einschließlich Ansichten und anderen Tabellenfunktionen.

Liste der systemdefinierten Tabellenfunktionen

Snowflake stellt die folgenden systemdefinierten Tabellenfunktionen bereit:

Unterkategorie

Funktion

Anmerkungen

Laden von Daten

INFER_SCHEMA

Weitere Informationen dazu finden Sie unter Laden von Daten in Snowflake.

VALIDATE

Datengenerierung

GENERATOR

Datenkonvertierung

SPLIT_TO_TABLE

STRTOK_SPLIT_TO_TABLE

Objektmodellierung

GET_OBJECT_REFERENCES

Semistrukturierte Abfragen

FLATTEN

Weitere Informationen dazu finden Sie unter Abfragen von semistrukturierten Daten.

Abfrageergebnisse

RESULT_SCAN

Kann verwendet werden, um SQL-Operationen bei der Ausgabe einer anderen SQL-Operation auszuführen (z. B. SHOW)

Verlaufs- und Nutzungsinformationen

(Snowflake Information Schema, Account Usage):

Benutzeranmeldung

LOGIN_HISTORY , LOGIN_HISTORY_BY_USER

Abfragen

QUERY_HISTORY , QUERY_HISTORY_BY_*

QUERY_ACCELERATION_HISTORY

Verfügbar als Teil der Vorschau des Query Acceleration Service.

Warehouse- und Speichernutzung

DATABASE_STORAGE_USAGE_HISTORY

WAREHOUSE_LOAD_HISTORY

WAREHOUSE_METERING_HISTORY

STAGE_STORAGE_USAGE_HISTORY

Sicherheit auf Spaltenebene & auf Zeilenebene

POLICY_REFERENCES

Objekt-Tagging

TAG_REFERENCES

Information Schema-Tabellenfunktion

TAG_REFERENCES_ALL_COLUMNS

Information Schema-Tabellenfunktion

TAG_REFERENCES_WITH_LINEAGE

Account Usage-Tabellenfunktionen

Kontoreplikation

REPLICATION_GROUP_REFRESH_HISTORY

Weitere Informationen dazu finden Sie unter Kontoreplikation und Failover.

REPLICATION_GROUP_REFRESH_PROGRESS, REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB

REPLICATION_GROUP_USAGE_HISTORY

Datenbankreplikation

DATABASE_REFRESH_HISTORY

Weitere Informationen dazu finden Sie unter Replizieren von Datenbanken über mehrere Konten.

DATABASE_REFRESH_PROGRESS , DATABASE_REFRESH_PROGRESS_BY_JOB

REPLICATION_USAGE_HISTORY

Laden von Daten und Datentransfer

COPY_HISTORY

DATA_TRANSFER_HISTORY

PIPE_USAGE_HISTORY

STAGE_DIRECTORY_FILE_REGISTRATION_HISTORY

VALIDATE_PIPE_LOAD

Daten-Clustering (innerhalb von Tabellen)

AUTOMATIC_CLUSTERING_HISTORY

Weitere Informationen dazu finden Sie unter Automatic Clustering.

Externe Funktionen

EXTERNAL_FUNCTIONS_HISTORY

Weitere Informationen dazu finden Sie unter Externe Funktionen.

Externe Tabellen

AUTO_REFRESH_REGISTRATION_HISTORY

Weitere Informationen dazu finden Sie unter Verwenden von externen Tabellen.

EXTERNAL_TABLE_FILES

EXTERNAL_TABLE_FILE_REGISTRATION_HISTORY

Verwaltung materialisierter Ansichten

MATERIALIZED_VIEW_REFRESH_HISTORY

Weitere Informationen dazu finden Sie unter Verwenden von materialisierten Ansichten.

Benachrichtigungen

NOTIFICATION_HISTORY

Weitere Informationen dazu finden Sie unter Senden von E-Mail-Benachrichtigungen.

SCIM-Verwaltung

REST_EVENT_HISTORY

Weitere Informationen dazu finden Sie unter Überwachen mit SCIM.

Verwaltung der Suchoptimierung

SEARCH_OPTIMIZATION_HISTORY

Weitere Informationen dazu finden Sie unter Verwenden des Suchoptimierungsdienstes.

Streams

SYSTEM$STREAM_BACKLOG

Weitere Informationen dazu finden Sie unter Änderungsnachverfolgung mit Tabellenstreams.

Aufgaben

COMPLETE_TASK_GRAPHS

Weitere Informationen dazu finden Sie unter Ausführen von SQL-Anweisungen für einen Zeitplan mithilfe von Aufgaben.

CURRENT_TASK_GRAPHS

SERVERLESS_TASK_HISTORY

TASK_DEPENDENTS

TASK_HISTORY

Syntax

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

Informationen zur funktionsspezifischen Syntax finden Sie in der Dokumentation zu den einzelnen systemdefinierten Tabellenfunktionen.

Nutzungshinweise

  • Tabellenfunktionen können mit dem LATERAL-Konstrukt auch auf einen Satz von Zeilen angewendet werden.

  • Um die Verwendung von Tabellenausdrücken zu ermöglichen, unterstützt Snowflake die ANSI/ISO-Standardsyntax für Tabellenausdrücke in der FROM-Klausel von Abfragen und Unterabfragen. Diese Syntax wird verwendet, um anzugeben, dass ein Ausdruck eine Sammlung von Zeilen anstelle einer einzelnen Zeile zurückgibt.

  • Die ANSI/ISO-Syntax ist nur in der FROM-Klausel der SELECT-Liste gültig. Sie können diese Schlüsselwörter und Klammern in einer Spezifikation für eine Unterabfrage einer Sammlung in keinem anderen Kontext weglassen.

Zurück zum Anfang