Verwendung von SQL-Befehlen zum Erstellen und Verwalten semantischer Ansichten

In diesem Thema wird erklärt, wie die folgenden SQL-Befehle zum Erstellen und Verwalten von semantische Ansichten verwendet werden:

In diesem Thema wird außerdem erläutert, wie die folgende gespeicherte Prozedur und Funktion aufgerufen werden, um aus einer YAML-Spezifikation eine semantische Ansicht zu erstellen und die Spezifikation für eine semantische Ansicht abzurufen.

Erforderliche Berechtigungen zum Erstellen oder Ersetzen einer semantischen Ansicht

Um eine semantische Ansicht zu erstellen oder zu ersetzen, müssen Sie eine Rolle mit den folgenden Berechtigungen verwenden:

  • CREATE SEMANTIC VIEW in dem Schema, in dem Sie die semantische Ansicht erstellen.

  • USAGE für die Datenbank und das Schema, in dem Sie die semantische Ansicht erstellen.

  • SELECT für die in der semantischen Ansicht verwendeten Tabellen und Ansichten.

Informationen zu den Berechtigungen, die für die Abfrage einer semantischen Ansicht erforderlich sind, finden Sie unter Erforderliche Berechtigungen für die Abfrage einer semantischen Ansicht.

Erstellen einer semantischen Ansicht unter Verwendung des Befehls CREATE SEMANTIC VIEW

Um eine semantische Ansicht zu erstellen, verwenden Sie den Befehl CREATE SEMANTIC VIEW.

Bemerkung

Um eine semantischen Ansicht anhand einer YAML-Spezifikation zu erstellen, rufen Sie die gespeicherte Prozedur SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML auf.

Die semantische Ansicht muss gültig sein. Siehe Wie Snowflake semantische Ansichten validiert.

Im folgenden Beispiel werden die TPC-H-Beispieldaten verwendet, die in Snowflake verfügbar sind. Dieses Datenset enthält Tabellen, die ein vereinfachtes Geschäftsszenario mit Kunden, Bestellungen und Einzelposten darstellen.

Datenmodell der in den TPC-H Beispieldaten verwendeten Tabellen

In diesem Beispiel wird eine semantische Ansicht mit dem Namen tpch_rev_analysis erstellt, die die Tabellen im Datensatz TPC-H verwendet. Die semantische Ansicht definiert:

  • Drei logische Tabellen (orders, customers, und line_items).

  • Eine Beziehung zwischen den Tabellen orders und customers.

  • Eine Beziehung zwischen den Tabellen line_items und orders.

  • Fakten, die zur Berechnung der Metriken verwendet werden.

  • Dimensionen für den Kundennamen, das Bestelldatum und das Jahr, in dem die Bestellung aufgegeben wurde.

  • Metriken für den durchschnittlichen Wert einer Bestellung und die durchschnittliche Anzahl von Einzelposten in einer Bestellung.

CREATE SEMANTIC VIEW tpch_rev_analysis

  TABLES (
    orders AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
      PRIMARY KEY (o_orderkey)
      WITH SYNONYMS ('sales orders')
      COMMENT = 'All orders table for the sales domain',
    customers AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER
      PRIMARY KEY (c_custkey)
      COMMENT = 'Main table for customer data',
    line_items AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.LINEITEM
      PRIMARY KEY (l_orderkey, l_linenumber)
      COMMENT = 'Line items in orders'
  )

  RELATIONSHIPS (
    orders_to_customers AS
      orders (o_custkey) REFERENCES customers,
    line_item_to_orders AS
      line_items (l_orderkey) REFERENCES orders
  )

  FACTS (
    line_items.line_item_id AS CONCAT(l_orderkey, '-', l_linenumber),
    orders.count_line_items AS COUNT(line_items.line_item_id),
    line_items.discounted_price AS l_extendedprice * (1 - l_discount)
      COMMENT = 'Extended price after discount'
  )

  DIMENSIONS (
    customers.customer_name AS customers.c_name
      WITH SYNONYMS = ('customer name')
      COMMENT = 'Name of the customer',
    orders.order_date AS o_orderdate
      COMMENT = 'Date when the order was placed',
    orders.order_year AS YEAR(o_orderdate)
      COMMENT = 'Year when the order was placed'
  )

  METRICS (
    customers.customer_count AS COUNT(c_custkey)
      COMMENT = 'Count of number of customers',
    orders.order_average_value AS AVG(orders.o_totalprice)
      COMMENT = 'Average order value across all orders',
    orders.average_line_items_per_order AS AVG(orders.count_line_items)
      COMMENT = 'Average number of line items per order'
  )

  COMMENT = 'Semantic view for revenue analysis';

In den nächsten Abschnitten wird dieses Beispiel ausführlicher erläutert:

Bemerkung

Ein vollständiges Beispiel finden Sie unter Beispiel für die Verwendung von SQL zur Erstellung einer semantischen Ansicht.

Definieren der logischen Tabellen

Verwenden Sie im Befehl CREATE SEMANTIC VIEW die Klausel TABLES, um die logischen Tabellen in der Ansicht zu definieren. In dieser Klausel können Sie:

  • Geben Sie den Namen der physischen Tabelle und einen optionalen Alias an.

  • Identifizieren Sie die folgenden Spalten in der logischen Tabelle:

    • Spalten, die als Primärschlüssel dienen.

    • Spalten, die eindeutige Werte enthalten (andere als die Primärschlüsselspalten).

    Sie können diese Spalten verwenden, um Beziehungen in dieser semantischen Ansicht zu definieren.

  • Fügen Sie Synonyme für die Tabelle hinzu (für eine bessere Auffindbarkeit).

  • Fügen Sie einen beschreibenden Kommentar hinzu.

In dem zuvor vorgestellten Beispiel definiert die Klausel TABLES drei logische Tabellen:

  • Eine Tabelle orders, die die Bestellinformationen aus der Tabelle TPC-H orders enthält.

  • Eine Tabelle customers, die die Kundeninformationen aus der Tabelle TPC-H customers enthält.

  • Eine Tabelle line_items, die die Einzelposten in Bestellungen aus der Tabelle TPC-H lineitem enthält.

In dem Beispiel wird die PRIMARY KEY-Klausel verwendet, um die Spalten zu identifizieren, die als Primärschlüssel für jede logische Tabelle verwendet werden sollen. Primärschlüssel und eindeutige Werte helfen bei der Bestimmung der Typen von Beziehungen zwischen den Tabellen (z. B. viele-zu-eins oder eins-zu-eins).

Das Beispiel enthält auch Synonyme und Kommentare, die die logischen Tabellen beschreiben und die Daten leichter auffindbar machen.

TABLES (
  orders AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
    PRIMARY KEY (o_orderkey)
    WITH SYNONYMS ('sales orders')
    COMMENT = 'All orders table for the sales domain',
  customers AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER
    PRIMARY KEY (c_custkey)
    COMMENT = 'Main table for customer data',
  line_items AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.LINEITEM
    PRIMARY KEY (l_orderkey, l_linenumber)
    COMMENT = 'Line items in orders'
)

Identifizierung der Beziehungen zwischen logischen Tabellen

Verwenden Sie im Befehl CREATE SEMANTIC VIEW die RELATIONSHIPS-Klausel, um die Beziehungen zwischen den Tabellen in der Ansicht zu identifizieren. Für jede Beziehung geben Sie Folgendes an:

  • Einen optionalen Namen für die Beziehung.

  • Den Namen der logischen Tabelle, die den Fremdschlüssel enthält.

  • Die Spalten in dieser Tabelle, die den Fremdschlüssel definieren.

  • Den Namen der logischen Tabelle, die den Primärschlüssel oder Spalten mit eindeutigen Werten enthält.

  • Die Spalten in dieser Tabelle, die den Primärschlüssel definieren oder eindeutige Werte enthalten.

    • Wenn Sie in der Klausel TABLES bereits PRIMARY KEY für die logische Tabelle angegeben haben, müssen Sie die Primärschlüsselspalte in der Beziehung nicht angeben.

    • Wenn es in der Klausel TABLES ein einziges UNIQUE-Schlüsselwort für die logische Tabelle gibt, müssen Sie die entsprechenden Spalten in der Beziehung nicht angeben.

    Sie können auch ein Datum, eine Uhrzeit, einen Zeitstempel oder eine numerische Spalte angeben, wenn Sie die Spalten eines Bereichs verknüpfen möchten.

In dem zuvor vorgestellten Beispiel gibt die Klausel RELATIONSHIPS zwei Beziehungen an:

  • Eine Beziehung zwischen den Tabellen orders und customers. In der Tabelle orders ist o_custkey der Fremdschlüssel, der sich auf den Primärschlüssel in der Tabelle customers (c_custkey) bezieht.

  • Eine Beziehung zwischen den Tabellen line_items und orders. In der Tabelle line_items ist l_orderkey der Fremdschlüssel, der sich auf den Primärschlüssel in der Tabelle orders (o_orderkey) bezieht.

RELATIONSHIPS (
  orders_to_customers AS
    orders (o_custkey) REFERENCES customers (c_custkey),
  line_item_to_orders AS
    line_items (l_orderkey) REFERENCES orders (o_orderkey)
)

Verwenden eines Datums, einer Uhrzeit, eines Zeitstempels oder eines Zahlenbereichs zum Verknüpfen logischer Tabellen

Wenn Sie eine Beziehung zwischen zwei logischen Tabellen angeben, werden die Tabellen standardmäßig mit einer Gleichheitsbedingung verknüpft.

Wenn Sie zwei logische Tabellen über einen Datums-, Uhrzeit-, Zeitstempel- oder Zahlenbereich verknüpfen müssen (wobei die Werte in einer Spalte einer Tabelle im gleichen Bereich liegen müssen wie die Werte in einer Spalte einer anderen Tabelle), können Sie das ASOF-Schlüsselwort mit dem Spaltennamen in der REFERENCES-Klausel angeben:

RELATIONSHIPS(
  my_relationship AS
    logical_table_1(
      col_table_1
    )
    REFERENCES
    logical_table_2(
      ASOF col_table_2
    )
)

Eine Abfrage der oben definierten semantischen Ansicht erzeugt einen ASOF JOIN, der den >= Vergleichsoperator in der MATCH_CONDITION-Klausel verwendet. Dadurch werden die beiden Tabellen so verknüpft, dass die Werte in col_table_1 größer als die Werte in col_table_2 oder gleich sind:

...
FROM logical_table_1 ASOF JOIN logical_table_2
  MATCH_CONDITION(
    logical_table_1.col_table_1 >= logical_table_2.col_table_2
  )
...

Bemerkung

In der MATCH_CONDITION-Klausel wird kein anderer Vergleichsoperator unterstützt.

Sie können das ASOF-Schlüsselwort für Spalten desselben Typs verwenden, den Sie auch für ASOF JOIN nutzen.

Bemerkung

Sie können höchstens ein ASOF-Schlüsselwort in der Definition einer bestimmten Beziehung angeben. Sie können dieses Schlüsselwort vor jeder Spalte in der Liste angeben.

Angenommen, Sie haben Tabellen mit Kunden-, Kundenadress- und Bestelldaten:

CREATE OR REPLACE TABLE customer(
  c_cust_id VARCHAR,
  c_first_name VARCHAR,
  c_last_name VARCHAR);

INSERT INTO customer VALUES
  ('cust001', 'Mary', 'Smith'),
  ('cust002', 'Bill', 'Wilson');

CREATE OR REPLACE TABLE customer_address(
  ca_cust_id VARCHAR,
  ca_zipcode VARCHAR,
  ca_street_addr VARCHAR,
  ca_start_date DATE,
  ca_end_date DATE
);

INSERT INTO customer_address VALUES
  ('cust001', '94025', '100 Main Street', '2024-01-01', '2024-03-31'),
  ('cust001', '94026', '200 Main Street', '2024-04-01', '2024-06-30'),
  ('cust001', '94027', '300 Main Street', '2024-07-01', NULL),
  ('cust002', '94028', '400 Main Street', '2024-01-01', '2024-04-30'),
  ('cust002', '94029', '500 Main Street', '2024-05-01', '2024-07-31'),
  ('cust002', '94030', '600 Main Street', '2024-08-01', NULL);

CREATE OR REPLACE TABLE orders(
  o_ord_id VARCHAR,
  o_cust_id VARCHAR,
  o_ord_date DATE,
  o_amount NUMBER
);

INSERT INTO orders VALUES
  ('ord100', 'cust001', '2024-02-01', 100),
  ('ord101', 'cust001', '2024-02-02', 200),
  ('ord102', 'cust001', '2024-05-01', 300),
  ('ord103', 'cust001', '2024-05-02', 400),
  ('ord104', 'cust001', '2024-08-01', 500),
  ('ord105', 'cust001', '2024-08-02', 600),
  ('ord106', 'cust002', '2024-03-01', 100),
  ('ord107', 'cust002', '2024-03-02', 200),
  ('ord108', 'cust002', '2024-06-01', 300),
  ('ord109', 'cust002', '2024-06-02', 400),
  ('ord110', 'cust002', '2024-09-01', 500),
  ('ord111', 'cust002', '2024-09-02', 600);

In diesem Beispiel hat die Tabelle customer_address hat die Spalte ca_start_date, die angibt, seit wann die Kundin oder der Kunde an der angegebenen Adresse ansässig ist. Die Tabelle orders hat die Spalte o_ord_date mit dem Datum der Bestellung.

Angenommen, Sie möchten Informationen zu Kundenaufträgen abfragen und die Postleitzahlen abrufen, die dem Standort der Kundin/des Kunden zum Zeitpunkt der Auftragsausführung entsprechen.

Sie können eine semantische Ansicht definieren, die eine ASOF-Verknüpfung zwischen den Spalten ca_start_date und o_ord_date angibt:

CREATE OR REPLACE SEMANTIC VIEW customer_orders_view
  TABLES (
    customer_address UNIQUE (ca_cust_id, ca_start_date),
    customer UNIQUE (c_cust_id),
    orders UNIQUE (o_ord_id)
  )
  RELATIONSHIPS (
    customer_address(ca_cust_id) REFERENCES customer,
    -- Defines an ASOF JOIN on the date columns.
    orders(o_cust_id, o_ord_date)
      REFERENCES
        customer_address(ca_cust_id, ASOF ca_start_date)
  )
  FACTS (
    customer_address.f_zipcode AS ca_zipcode
  )
  DIMENSIONS (
    -- Relies on the ASOF join to retrieve the zip code
    -- where the order date is greater than or equal to
    -- the address starting date.
    orders.f_cust_zipcode AS customer_address.f_zipcode,
    orders.dim_year_month AS DATE_TRUNC('month', o_ord_date)
  )
  METRICS (
    orders.m_order_amount AS SUM(o_amount)
  );

Angenommen, Sie führen eine Abfrage dieser semantischen Ansicht durch, um die Summe der Bestellbeträge pro Monat für jede Postleitzahl zu ermitteln:

SELECT * FROM SEMANTIC_VIEW(
  customer_orders_view
  DIMENSIONS orders.dim_year_month, orders.f_cust_zipcode
  METRICS orders.m_order_amount
);
+----------------+----------------+----------------+
| DIM_YEAR_MONTH | F_CUST_ZIPCODE | M_ORDER_AMOUNT |
|----------------+----------------+----------------|
| 2024-02-01     | 94025          |            300 |
| 2024-05-01     | 94026          |            700 |
| 2024-08-01     | 94027          |           1100 |
| 2024-03-01     | 94028          |            300 |
| 2024-09-01     | 94030          |           1100 |
| 2024-06-01     | 94029          |            700 |
+----------------+----------------+----------------+

Die Abfrage verwendet im Endeffekt einen ASOF JOIN zur Verknüpfung der Tabellen über die Datumsspalten, wobei das Bestelldatum nicht vor dem Startdatum der Adresse liegen darf:

...
FROM orders ASOF JOIN customer_address
  MATCH_CONDITION(
    orders.o_ord_date >= customer_address.ca_start_date
  )
  ON
    orders.o_cust_id = customer_address.ca_cust_id
...

Verknüpfen logischer Tabellen, die Wertebereiche enthalten

Sie können eine Bereichsverknüpfung verwenden, wenn Sie eine Tabelle mit einer anderen Tabelle verknüpfen möchten, die einen Bereich von möglichen Werten in der ersten Tabelle definiert. Angenommen, eine Tabelle repräsentiert die Kundenaufträge und enthält eine Spalte mit dem Zeitstempel, wann die Bestellung erteilt wurde. Angenommen, eine andere Tabelle repräsentiert die Geschäftsquartale und enthält die unterschiedlichen Zeitbereiche, die diese Quartale darstellen. Sie können eine semantische Ansicht erstellen, die die beiden Tabellen so verknüpft, dass die Zeile für einen Auftrag das Geschäftsquartal enthält, in dem der Auftrag erteilt wurde.

In der Tabelle, die die Bereiche enthält, muss jeder Bereich eindeutig sein. Es können sich keine zwei Bereiche überschneiden.

Wenn Sie in den Tabellendaten den niedrigstmöglichen Wert für den Bereich oder den höchstmöglichen Wert für den Bereich angeben möchten, verwenden Sie NULL.

Die folgende Tabelle definiert zum Beispiel eine Menge von Zeitbereichen, die sich nicht überschneiden:

  • Die erste Zeile deckt den Bereich ab, der alles bis (aber nicht einschließlich) zum 1. Januar 2024 umfasst.

  • Die letzte Zeile deckt den Bereich ab, der alles ab dem 20. März 2024 umfasst.

+----------------+------------------+-------------------------+-------------------------+
| TIME_PERIOD_ID | TIME_PERIOD_NAME | START_TIME              | END_TIME                |
|----------------+------------------+-------------------------+-------------------------|
|              1 | Before_January   | NULL                    | 2024-01-01 00:00:00.000 |
|              2 | Early_January    | 2024-01-01 00:00:00.000 | 2024-01-15 00:00:00.000 |
|              3 | Late_January     | 2024-01-15 00:00:00.000 | 2024-02-01 00:00:00.000 |
|              4 | Early_February   | 2024-02-01 00:00:00.000 | 2024-02-15 00:00:00.000 |
|              5 | Late_February    | 2024-02-15 00:00:00.000 | 2024-03-01 00:00:00.000 |
|              6 | Early_March      | 2024-03-01 00:00:00.000 | 2024-03-20 00:00:00.000 |
|              7 | After_March20    | 2024-03-20 00:00:00.000 | NULL                    |
+----------------+------------------+-------------------------+-------------------------+

Bemerkung

In den Start- und Ende-Spalten darf jeweils höchstens eine Zeile den Wert NULL enthalten.

Für Fälle wie diese können Sie eine semantische Ansicht einrichten, die Bereichsverknüpfungsabfragen unterstützt. Wenn Sie die semantische Ansicht erstellen, müssen Sie Folgendes tun:

  1. Definieren Sie für die logische Tabelle, die die Start- und Endzeiten eines Zeitraums enthält, eine Einschränkung, die angibt, dass sich keine zwei Bereiche überlappen können.

    Geben Sie der TABLE-Klausel des Befehls CREATE SEMANTIC VIEW die CONSTRAINT-Klausel in der Definition der logischen Tabelle an. Die Syntax finden Sie in der Dokumentation für CONSTRAINT im Thema zu CREATE SEMANTIC VIEW.

  2. Definieren Sie eine Beziehung zwischen der Spalte, die den Zeitstempel in einer Tabelle enthält, und den Spalten für Start- und Endzeit in der anderen Tabelle.

    Verwenden Sie in der RELATIONSHIPS-Klausel des Befehls CREATE SEMANTIC VIEW die BETWEEN-Klausel, um die Spalten anzugeben, die die Start- und Endzeiten enthalten. Die Syntax finden Sie in der Dokumentation für RELATIONSHIP im Thema zu CREATE SEMANTIC VIEW.

Angenommen, die Tabelle my_time_periods definiert bestimmte Zeiträume:

CREATE OR REPLACE TABLE my_time_periods (
  time_period_id INT PRIMARY KEY,
  time_period_name VARCHAR(50),
  start_time TIMESTAMP,
  end_time TIMESTAMP
);
INSERT INTO my_time_periods (
    time_period_id, time_period_name, start_time, end_time
  ) VALUES
    (1, 'Before_January', NULL, '2024-01-01 00:00:00'::TIMESTAMP),
    (2, 'Early_January', '2024-01-01 00:00:00'::TIMESTAMP, '2024-01-15 00:00:00'::TIMESTAMP),
    (3, 'Late_January', '2024-01-15 00:00:00'::TIMESTAMP, '2024-02-01 00:00:00'::TIMESTAMP),
    (4, 'Early_February', '2024-02-01 00:00:00'::TIMESTAMP, '2024-02-15 00:00:00'::TIMESTAMP),
    (5, 'Late_February', '2024-02-15 00:00:00'::TIMESTAMP, '2024-03-01 00:00:00'::TIMESTAMP),
    (6, 'Early_March', '2024-03-01 00:00:00'::TIMESTAMP, '2024-03-20 00:00:00'::TIMESTAMP),
    (7, 'After_March20', '2024-03-20 00:00:00'::TIMESTAMP, NULL);

Angenommen, die Tabelle my_events erfasst Ereignisse, die innerhalb dieser Zeiträume aufgetreten sind:

CREATE OR REPLACE TABLE my_events (
  event_id INTEGER PRIMARY KEY,
  event_timestamp TIMESTAMP,
  event_name VARCHAR
);
INSERT INTO my_events (event_id, event_name, event_timestamp) VALUES
  (1, 'Login', '2024-01-15 10:00:00'::TIMESTAMP),
  (2, 'Purchase', '2024-01-15 14:30:00'::TIMESTAMP),
  (3, 'Logout', '2024-01-15 18:45:00'::TIMESTAMP),
  (4, 'Review', '2024-02-10 12:00:00'::TIMESTAMP),
  (5, 'Support', '2024-02-20 09:30:00'::TIMESTAMP),
  (6, 'Upgrade', '2024-03-05 16:00:00'::TIMESTAMP),
  (7, 'Feedback', '2024-03-25 11:00:00'::TIMESTAMP);

Sie können eine semantische Ansicht definieren, die die Tabellen verknüpft. Zeilen in my_events werden mit Zeilen in my_time_periods verknüpft, wobei der Wert in Spalte event_timestamp in``my_events`` innerhalb des durch die Spalten start_time und end_time in my_time_periods angegebene Bereichs liegt.

CREATE OR REPLACE SEMANTIC VIEW my_semantic_view_range_join
  TABLES (
    my_events PRIMARY KEY (event_id),
    my_time_periods UNIQUE (start_time, end_time)
      CONSTRAINT my_time_period_range DISTINCT RANGE BETWEEN start_time AND end_time EXCLUSIVE
  )
  RELATIONSHIPS (
    my_time_periods_for_events AS
      my_events(event_timestamp) REFERENCES
        my_time_periods(BETWEEN start_time AND end_time EXCLUSIVE)
  )
  DIMENSIONS (
    my_events.dim_event_name AS event_name,
    my_events.dim_event_timestamp AS event_timestamp,
    my_time_periods.dim_time_period_name AS time_period_name
  )
  METRICS (
    my_events.m_event_count AS COUNT(*)
  );

Die folgende Abfrage veranschaulicht, wie die Zeilen verknüpft werden:

SELECT
    sv.dim_event_name,
    sv.dim_event_timestamp,
    sv.dim_time_period_name,
    sv.m_event_count
  FROM SEMANTIC_VIEW(
    my_semantic_view_range_join
    METRICS my_events.m_event_count
    DIMENSIONS
      my_events.dim_event_name,
      my_events.dim_event_timestamp,
      my_time_periods.dim_time_period_name
  ) AS sv
  ORDER BY
    sv.dim_event_timestamp,
    sv.dim_time_period_name;
+----------------+-------------------------+----------------------+---------------+
| DIM_EVENT_NAME | DIM_EVENT_TIMESTAMP     | DIM_TIME_PERIOD_NAME | M_EVENT_COUNT |
|----------------+-------------------------+----------------------+---------------|
| Login          | 2024-01-15 10:00:00.000 | Late_January         |             1 |
| Purchase       | 2024-01-15 14:30:00.000 | Late_January         |             1 |
| Logout         | 2024-01-15 18:45:00.000 | Late_January         |             1 |
| Review         | 2024-02-10 12:00:00.000 | Early_February       |             1 |
| Support        | 2024-02-20 09:30:00.000 | Late_February        |             1 |
| Upgrade        | 2024-03-05 16:00:00.000 | Early_March          |             1 |
| Feedback       | 2024-03-25 11:00:00.000 | After_March20        |             1 |
+----------------+-------------------------+----------------------+---------------+

Wie in den Beispielen gezeigt, ist die dim_time_period_name-Dimension für jede Zeile in den Ergebnissen der Name des Zeitraums, in den die dim_event_timestamp-Dimension fällt.

Definition von Fakten, Dimensionen und Metriken

Verwenden Sie im Befehl CREATE SEMANTIC VIEW die Klauseln FACTS, DIMENSIONS und METRICS, um die Fakten, Dimensionen und Metriken in der semantischen Ansicht zu definieren.

Sie müssen mindestens eine Dimension oder Metrik in der semantischen Ansicht definieren.

Für jeden Fakt, jede Dimension oder Metrik, geben Sie an:

  • Die logische Tabelle, zu der sie gehört.

    Bemerkung

    Wenn Sie eine abgeleitete Metrik definieren möchten (eine Metrik, die nicht für eine logische Tabelle spezifisch ist), müssen Sie den Namen der logischen Tabelle weglassen. Siehe Abgeleitete Metriken definieren.

  • Einen Namen für den Fakt, die Dimension oder die Metrik.

  • Den SQL-Ausdruck, um ihn zu berechnen.

    Bemerkung

    Für Dimensionen können Sie einen Cortex Search Service </user-guide/snowflake-cortex/cortex-search/cortex-search-overview>`angeben, der für die Dimension verwendet werden soll. Weitere Informationen dazu finden Sie unter :ref:`label-semantic_views_create_cortex_search_service_dimension.

  • Optionale Synonyme und Kommentare.

Bemerkung

Wenn eine Metrik nicht über bestimmte Dimensionen hinweg aggregiert werden soll, sollten Sie angeben, dass diese Dimensionen nicht additiv sein sollen.

Weitere Informationen dazu finden Sie unter Identifizieren der Dimensionen, die für eine Metrik nicht additiv sein sollen.

Das zuvor vorgestellte Beispiel definiert mehrere Fakten, Dimensionen und Metriken:

FACTS (
  line_items.line_item_id AS CONCAT(l_orderkey, '-', l_linenumber),
  orders.count_line_items AS COUNT(line_items.line_item_id),
  line_items.discounted_price AS l_extendedprice * (1 - l_discount)
    COMMENT = 'Extended price after discount'
)

DIMENSIONS (
  customers.customer_name AS customers.c_name
    WITH SYNONYMS = ('customer name')
    COMMENT = 'Name of the customer',
  orders.order_date AS o_orderdate
    COMMENT = 'Date when the order was placed',
  orders.order_year AS YEAR(o_orderdate)
    COMMENT = 'Year when the order was placed'
)

METRICS (
  customers.customer_count AS COUNT(c_custkey)
    COMMENT = 'Count of number of customers',
  orders.order_average_value AS AVG(orders.o_totalprice)
    COMMENT = 'Average order value across all orders',
  orders.average_line_items_per_order AS AVG(orders.count_line_items)
    COMMENT = 'Average number of line items per order'
)

Bemerkung

Weitere Richtlinien zum Definieren von Metriken, die Fensterfunktionen verwenden, finden Sie unter Fensterfunktionsmetriken definieren und abfragen.

Definieren einer Dimension, die einen Cortex Search Service verwendet

Um eine Dimension zu definieren, die einen Cortex Search Service verwendet, legen Sie die WITH CORTEX SEARCH SERVICE-Klausel auf den Namen des Cortex Search Service fest. Wenn sich der Dienst in einer anderen Datenbank oder einem anderen Schema befindet, qualifizieren Sie den Namen des Dienstes. Beispiel:

DIMENSIONS (
  my_table.my_dimension AS my_dimension_expression
    WITH CORTEX SEARCH SERVICE my_db.my_schema.my_dimension_search_service
)

Abgeleitete Metriken definieren

Wenn Sie eine Metrik definieren, geben Sie den Namen der logischen Tabelle an, zu der die Metrik gehört. Dies ist die logische Tabelle, in der die Metrik aggregiert wird.

Wenn Sie eine Metrik auf der Grundlage von Metriken aus verschiedenen logischen Tabellen definieren möchten, können Sie eine abgeleitete Metrik definieren. Eine abgeleitete Metrik ist eine Metrik, die auf die semantische Ansicht (und nicht auf eine bestimmte logische Tabelle) beschränkt ist. Eine abgeleitete Metrik kann Metriken aus mehrere logischen Tabellen kombinieren.

Lassen Sie bei der Definition einer abgeleiteten Metrik den Namen der logischen Tabelle weg.

Angenommen, Sie möchten die Metrik my_derived_metric_1 definieren, die die Summe der Metriken table_1.metric_1 und table_2.metric_2 ist. Wenn Sie my_derived_metric_1 definieren, qualifizieren Sie den Namen nicht mit einem logischen Tabellennamen:

CREATE SEMANTIC VIEW sv_with_derived_metrics
  TABLES (
    table_1 PRIMARY KEY (column_1),
    table_2 PRIMARY KEY (column_2)
  )
  ...
  METRICS (
    table_1.metric_1 AS SUM(...),
    table_2.metric_2 AS SUM(...),
    my_derived_metric_1 AS table_1.metric_1 + table_2.metric_2
  )
 ...

Sie können andere abgeleitete Metriken in dem Ausdruck verwenden. Beispiel:

METRICS (
  ...
  my_derived_metric_1 AS table_1.metric_1 + table_2.metric_2,
  my_view_metric_2 AS my_derived_metric_1 + table_3.metric_3
)

Beachten Sie die folgenden Einschränkungen, wenn Sie eine abgeleitete Metrik definieren:

  • Sie können für eine abgeleitete Metrik und eine reguläre Metrik nicht denselben Namen verwenden.

  • Der Ausdruck für eine abgeleitete Metrik kann Folgendes verwenden:

    • Aggregationen von Dimensionen und Fakten, die in einer beliebigen logischen Tabelle in der semantischen Ansicht definiert sind.

    • Skalare Ausdrücke von Metriken, die in einer beliebigen logischen Tabelle in der semantischen Ansicht definiert sind.

    • Andere abgeleitete Metriken.

    Im folgenden Beispiel:

    • Verwendet derived_metric_1 einen skalaren Ausdruck mit zwei Metriken.

    • Verwendet derived_metric_2 eine Aggregation einer Dimension.

    • Fügt derived_metric_3 eine Aggregation einer Dimension zu einer anderen abgeleiteten Metrik hinzu.

    CREATE OR REPLACE SEMANTIC VIEW sv_derived_metrics
      TABLES (t1)
      DIMENSIONS (t1.dim1 AS t1.col1)
      METRICS (
        t1.m1 AS SUM(t1.col1),
        t2.m2 AS SUM(t1.col2),
        derived_metric_1 AS t1.m1 + t2.m2,
        derived_metric_2 AS SUM(t1.dim1),
        derived_metric_3 AS SUM(t1.dim1) + derived_metric_2
      )
      ...
    
  • Sie müssen den Namen einer Metrik, Dimension oder eines Fakts im Ausdruck nicht qualifizieren, wenn der Name eindeutig ist. Beispiel:

    METRICS (
      table_1.metric_1 AS ...,
      table_1.my_unique_metric_name AS ...,
      table_2.metric_1 AS ...,
      my_derived_metric_1 AS table_1.metric_1 + my_unique_metric_name
    )
    

    Beachten Sie, dass metric_1 durch table_1 qualifiziert werden muss, da es zwei Metriken mit dem Namen metric_1 gibt. Allerdings muss my_unique_metric_name nicht qualifiziert werden, da der Name eindeutig ist.

  • Im Ausdruck für eine abgeleitete Metrik können Sie Folgendes nicht verwenden:

    • Aggregationen von Metriken.

    • Fensterfunktionen

    • Verweise auf physische Spalten.

    • Verweise auf Fakten oder Dimensionen, die nicht aggregiert sind.

  • Sie können eine abgeleitete Metrik im Ausdruck nicht für eine reguläre Metrik, reguläre Dimension oder regulären Fakt verwenden. Nur eine andere abgeleitete Metrik kann eine abgeleitete Metrik in ihrem Ausdruck verwenden.

Angeben der Beziehung für eine Metrik, wenn mehrere Beziehungspfade existieren

In einigen Fällen können zwischen zwei bestimmten logischen Tabellen in einer semantischen Ansicht mehrere Beziehungspfade existieren. In diesen Fällen müssen Sie bei der Definition einer Metrik den zu verwendenden Beziehungspfad angeben.

Das Problem mit mehreren Beziehungspfaden

Angenommen, Sie haben zwei Tabellen, die Informationen zu Flügen und Flughäfen enthalten:

CREATE OR REPLACE TABLE airports (
  airport_code VARCHAR PRIMARY KEY,
  city_name VARCHAR,
  airport_region_code VARCHAR
);

INSERT INTO airports VALUES
  ('SEA', 'Seattle', 'NA'),
  ('SFO', 'San Fransico', 'NA'),
  ('PVG', 'Shanghai', 'AS');

SELECT * FROM airports;
+--------------+--------------+---------------------+
| AIRPORT_CODE | CITY_NAME    | AIRPORT_REGION_CODE |
|--------------+--------------+---------------------|
| SEA          | Seattle      | NA                  |
| SFO          | San Fransico | NA                  |
| PVG          | Shanghai     | AS                  |
+--------------+--------------+---------------------+
CREATE OR REPLACE TABLE flights (
  flight_id INTEGER PRIMARY KEY,
  departure_airport VARCHAR,
  arrival_airport VARCHAR,
  is_late BOOLEAN,
  aircraft_id INTEGER,
  departure_time DATETIME,
  arrival_time DATETIME
);

INSERT INTO flights VALUES
  (1, 'SFO', 'SEA', true, 1, '2025-01-03 06:00:00', '2025-01-03 11:00:00'),
  (2, 'SEA', 'SFO', false, 2, '2025-01-03 11:00:00', '2025-01-03 16:00:00'),
  (3, 'SEA', 'PVG', false, 3, '2025-01-03 11:00:00', '2025-01-04 11:00:00'),
  (4, 'SFO', 'PVG', true, 1, '2025-01-03 06:00:00', '2025-01-04 11:00:00');

SELECT * FROM flights;
+-----------+-------------------+-----------------+---------+-------------+-------------------------+-------------------------+
| FLIGHT_ID | DEPARTURE_AIRPORT | ARRIVAL_AIRPORT | IS_LATE | AIRCRAFT_ID | DEPARTURE_TIME          | ARRIVAL_TIME            |
|-----------+-------------------+-----------------+---------+-------------+-------------------------+-------------------------|
|         1 | SFO               | SEA             | True    |           1 | 2025-01-03 06:00:00.000 | 2025-01-03 11:00:00.000 |
|         2 | SEA               | SFO             | False   |           2 | 2025-01-03 11:00:00.000 | 2025-01-03 16:00:00.000 |
|         3 | SEA               | PVG             | False   |           3 | 2025-01-03 11:00:00.000 | 2025-01-04 11:00:00.000 |
|         4 | SFO               | PVG             | True    |           1 | 2025-01-03 06:00:00.000 | 2025-01-04 11:00:00.000 |
+-----------+-------------------+-----------------+---------+-------------+-------------------------+-------------------------+

Angenommen, Sie definieren eine semantische Ansicht, die Informationen über die Gesamtzahl der Flüge bereitstellt, die von einer bestimmten Stadt abfliegen und dort ankommen:

CREATE OR REPLACE SEMANTIC VIEW flights_sv
  TABLES (
    flights PRIMARY KEY (flight_id),
    airports PRIMARY KEY (airport_code)
  ) RELATIONSHIPS (
    flight_departure_airport AS flights(departure_airport) REFERENCES airports(airport_code),
    flight_arrival_airport AS flights(arrival_airport) REFERENCES airports(airport_code)
  ) DIMENSIONS (
    airports.city_name AS city_name
  ) METRICS (
    flights.m_flight_count AS COUNT(flight_id)
  );

Die semantische Ansicht gibt zwei verschiedene Beziehungen zwischen der Tabelle flights und der Tabelle airports (flight_departure_airport und``flight_arrival_airport``) an. Da es mehrere Beziehungspfade zwischen den Tabellen gibt, schlägt das Abfragen der m_flight_count-Metrik und das Auswählen der airports.city_name-Dimension (oder einer beliebige Dimension in der Tabelle airports) fehl:

SELECT * FROM SEMANTIC_VIEW (
  flights_sv
  METRICS flights.m_flight_count
  DIMENSIONS airports.city_name
);
010246 (42601): SQL compilation error:
Invalid dimension specified: Multi-path relationship between the dimension entity 'AIRPORTS'
  and the base metric or dimension entity 'FLIGHTS' is not supported.

Weil es mehrere Pfade zwischen den Tabellen flights und airports``gibt, schlägt die Abfrage fehl. Wenn die Abfrage keine Dimension aus der Tabelle ``airports ausgewählt hat, wäre die Abfrage erfolgreich.

Angeben der zu verwendenden Beziehung

In der Metrikdefinition im Befehl CREATE SEMANTIC VIEW können Sie angeben, welche Beziehung in der USING-Klausel verwendet werden soll:

METRICS (
  <table_alias>.<metric>
    [ USING ( <relationship_name> [ , ... ] )
    AS <sql_expr>
  [ , ... ]
)

Bemerkung

  • Jede Beziehung, die Sie angeben, muss mit der logischen Tabelle beginnen, die die Metrik enthält. Angenommen, Sie möchten Folgendes angeben:

    METRICS (
      table_a.metric_a
        USING ( table_a_to_table_b )
        ...
    

    Die Beziehung table_a_to_table_b muss von table_a aus beginnen:

    RELATIONSHIPS (
      table_a_to_table_b AS table_a(col_1) REFERENCES table_b(col_1)
      ...
    
  • Sie können keine Sequenz von Beziehungen (z. B.``table_a_to_table_b`` und table_b_to_table_c) angeben. Jede Beziehung muss mit der logischen Tabelle beginnen, die die Metrik enthält.

  • Wenn Sie die Beziehungen zwischen der logischen Tabelle, die die Metrik enthält, zu verschiedenen Tabellen identifizieren müssen, können Sie die Beziehungen in der USING-Klausel angeben. Angenommen, Sie möchten, dass die Metriken anhand bestimmter Beziehungen von table_a zu table_b und von table_a zu table_c berechnet wird. In diesem Fall geben Sie beide Beziehungen in der USING-Klausel an:

    METRICS (
      table_a.metric_a
        USING ( table_a_to_table_b, table_a_to_table_c )
        ...
    
  • Sie können die USING-Klausel nicht in einer abgeleiteten Metrik angeben.

Die folgende Anweisung definiert zum Beispiel zwei zusätzliche Metriken, die bestimmte Beziehungen verwenden:

  • m_flight_departure_count, die die flight_departure_airport-Beziehung verwendet.

  • m_flight_arrival_count, die die flight_arrival_airport-Beziehung verwendet.

CREATE OR REPLACE SEMANTIC VIEW flights_sv
  TABLES (
    flights PRIMARY KEY (flight_id),
    airports PRIMARY KEY (airport_code)
  ) RELATIONSHIPS (
    flight_departure_airport AS flights(departure_airport) REFERENCES airports(airport_code),
    flight_arrival_airport AS flights(arrival_airport) REFERENCES airports(airport_code)
  ) DIMENSIONS (
    airports.city_name AS city_name
  ) METRICS (
    flights.m_flight_count AS COUNT(flight_id),
    flights.m_flight_departure_count USING (flight_departure_airport) AS flights.m_flight_count,
    flights.m_flight_arrival_count USING (flight_arrival_airport) AS flights.m_flight_count
  );

Wenn Sie diese Ansicht abfragen, können Sie die beiden neuen Metriken angeben, die bestimmte Beziehungen verwenden:

SELECT * FROM SEMANTIC_VIEW (
  flights_sv
  METRICS flights.m_flight_arrival_count, flights.m_flight_departure_count
  DIMENSIONS airports.city_name
);
+------------------------+--------------------------+--------------+
| M_FLIGHT_ARRIVAL_COUNT | M_FLIGHT_DEPARTURE_COUNT | CITY_NAME    |
|------------------------+--------------------------+--------------|
|                      1 |                        2 | San Fransico |
|                      1 |                        2 | Seattle      |
|                      2 |                     NULL | Shanghai     |
+------------------------+--------------------------+--------------+

Hinzufügen von Dimensionen, die auf denselben Beziehungen beruhen

Die Abfrage im vorherigen Beispiel hat die airports.city_name-Dimension verwendet, die sich in der logischen Tabelle airports befindet, auf der die Beziehungen basieren.

Wenn Sie der Ansicht eine Dimension für eine andere logische Tabelle hinzufügen, profitieren Abfragen dieser Dimension von den zuvor angegebenen Beziehungen.

Angenommen, Sie erstellen eine Tabelle mit dem Namen regions mit zusätzlichen Informationen zu den Flughafenregionen, die in der Spalte airport_region_code der airports Tabelle angegeben sind:

CREATE OR REPLACE TABLE regions (
  region_code VARCHAR PRIMARY KEY,
  region_name VARCHAR
);

INSERT INTO regions VALUES
  ('NA', 'North America'),
  ('AS', 'Asia');

SELECT * FROM regions;
+-------------+---------------+
| REGION_CODE | REGION_NAME   |
|-------------+---------------|
| NA          | North America |
| AS          | Asia          |
+-------------+---------------+

Sie können die zuvor definierte semantische Ansicht erweitern, um den Namen der Region zurückzugeben:

  • Fügen Sie eine neue logische Tabelle für die Tabelle regions hinzu.

  • Fügen Sie eine Beziehung zwischen den Tabellen regions und airports hinzu.

  • Fügen Sie eine Dimension für den Namen der Region hinzu.

Sie müssen keine weiteren Änderungen an der USING-Klausel für die Metriken vornehmen, da es nur eine einzige Beziehung zwischen den Tabellen regions und airports gibt.

CREATE OR REPLACE SEMANTIC VIEW flights_by_regions_sv
  TABLES (
    flights PRIMARY KEY (flight_id),
    airports PRIMARY KEY (airport_code),
    regions PRIMARY KEY (region_code)
  ) RELATIONSHIPS (
    flight_departure_airport AS flights(departure_airport) REFERENCES airports(airport_code),
    flight_arrival_airport AS flights(arrival_airport) REFERENCES airports(airport_code),
    airport_region AS airports(airport_region_code) REFERENCES regions(region_code)
  ) DIMENSIONS (
    airports.city_name AS city_name,
    regions.region_name AS region_name
  ) METRICS (
    flights.m_flight_count AS COUNT(flight_id),
    flights.m_flight_departure_count USING (flight_departure_airport) AS flights.m_flight_count,
    flights.m_flight_arrival_count USING (flight_arrival_airport) AS flights.m_flight_count
  );

Wenn Sie die Ansicht unter Verwendung der region_name-Dimension abfragen und eine Mehrdeutigkeit darüber besteht, welche Beziehung verwendet werden soll, bestimmt die USING-Klausel die zu verwendenden Beziehungen:

SELECT * FROM SEMANTIC_VIEW (
  flights_by_regions_sv
  METRICS flights.m_flight_arrival_count, flights.m_flight_departure_count
  DIMENSIONS regions.region_name
);
+------------------------+--------------------------+---------------+
| M_FLIGHT_ARRIVAL_COUNT | M_FLIGHT_DEPARTURE_COUNT | REGION_NAME   |
|------------------------+--------------------------+---------------|
|                      2 |                        4 | North America |
|                      2 |                     NULL | Asia          |
+------------------------+--------------------------+---------------+

Angeben von Beziehungen zu verschiedenen Tabellen

Wenn die semantische Ansicht Dimensionen aus mehreren Tabellen verwendet und Sie die Beziehungen angeben müssen, die für diese Dimensionen verwendet werden sollen, können Sie in der USING-Klausel mehrere Beziehungen angeben.

Angenommen, Sie erstellen eine Tabelle mit dem Namen weather mit Wetterinformationen zu den Flughäfen in der Tabelle airports:

CREATE OR REPLACE TABLE weather (
  airport_code VARCHAR PRIMARY KEY,
  weather_condition VARCHAR,
  start_date DATETIME,
  end_date DATETIME
);

INSERT INTO weather VALUES
  ('SEA', 'rainy', '2025-01-01 10:00:00', '2025-01-01 12:00:00'),
  ('SEA', 'rainy', '2025-01-03 10:00:00', '2025-01-03 12:00:00'),
  ('SFO', 'sunny', '2025-01-03 05:00:00', '2025-01-03 09:00:00'),
  ('SFO', 'sunny', '2025-01-03 10:00:00', '2025-01-03 18:00:00'),
  ('PVG', 'cloudy', '2025-01-04 10:00:00', '2025-01-04 12:00:00');

SELECT * FROM weather;
+--------------+-------------------+-------------------------+-------------------------+
| AIRPORT_CODE | WEATHER_CONDITION | START_DATE              | END_DATE                |
|--------------+-------------------+-------------------------+-------------------------|
| SEA          | rainy             | 2025-01-01 10:00:00.000 | 2025-01-01 12:00:00.000 |
| SEA          | rainy             | 2025-01-03 10:00:00.000 | 2025-01-03 12:00:00.000 |
| SFO          | sunny             | 2025-01-03 05:00:00.000 | 2025-01-03 09:00:00.000 |
| SFO          | sunny             | 2025-01-03 10:00:00.000 | 2025-01-03 18:00:00.000 |
| PVG          | cloudy            | 2025-01-04 10:00:00.000 | 2025-01-04 12:00:00.000 |
+--------------+-------------------+-------------------------+-------------------------+

Sie können die zuvor definierte semantische Ansicht erweitern, um die Wetterbedingung zurückzugeben:

  • Fügen Sie eine neue logische Tabelle für die Tabelle weather hinzu.

  • Fügen Sie zwei Beziehungen zwischen den Tabellen weather und``flights`` hinzu (eine für abfliegende und eine für ankommende Flüge).

  • Fügen Sie eine Dimension für die Wetterinformationen hinzu.

  • Geben Sie an, dass die Metriken auch die beiden neuen Beziehungen zwischen den Tabellen weather und flights verwenden sollen.

CREATE OR REPLACE SEMANTIC VIEW flights_and_weather_sv
  TABLES (
    flights PRIMARY KEY (flight_id),
    airports PRIMARY KEY (airport_code),
    weather PRIMARY KEY (airport_code, start_date, end_date)
  ) RELATIONSHIPS (
    flight_departure_airport AS flights(departure_airport) REFERENCES airports(airport_code),
    flight_arrival_airport AS flights(arrival_airport) REFERENCES airports(airport_code),
    flight_departure_weather AS flights(departure_airport, departure_time) REFERENCES weather(airport_code, BETWEEN start_date AND end_date EXCLUSIVE),
    flight_arrival_weather AS flights(arrival_airport, arrival_time) REFERENCES weather(airport_code, BETWEEN start_date AND end_date EXCLUSIVE)
  ) DIMENSIONS (
    airports.city_name AS city_name,
    weather.weather_condition AS weather_condition
  ) METRICS (
    flights.m_flight_count AS COUNT(flight_id),
    flights.m_flight_departure_count USING (flight_departure_airport, flight_departure_weather) AS flights.m_flight_count,
    flights.m_flight_arrival_count USING (flight_arrival_airport, flight_arrival_weather) AS flights.m_flight_count
  );

Wenn Sie die Ansicht abfragen und die weather_condition-Dimension angeben, bestimmt die USING-Klausel die verwendeten Beziehungen:

SELECT * FROM SEMANTIC_VIEW (
  flights_by_regions_sv
  METRICS flights.m_flight_arrival_count, flights.m_flight_departure_count
  DIMENSIONS weather.weather_condition
);
+------------------------+--------------------------+-------------------+
| M_FLIGHT_ARRIVAL_COUNT | M_FLIGHT_DEPARTURE_COUNT | WEATHER_CONDITION |
|------------------------+--------------------------+-------------------|
|                      2 |                     NULL | cloudy            |
|                      1 |                        2 | sunny             |
|                      1 |                        2 | rainy             |
+------------------------+--------------------------+-------------------+

Definieren von abgeleiteten Metriken basierend auf Metriken, die bestimmte Beziehungen verwenden

Obwohl Sie die USING-Klausel nicht in einer abgeleiteten Metrik angeben können, können Sie eine abgeleitete Metrik definieren, die Metriken verwendet, die die USING-Klausel angeben.

Die folgende semantische Ansicht definiert zum Beispiel zwei abgeleitete Metriken:

  • global_m_departure_arrival_ratio

  • global_m_departure_arrival_sum

Die Definitionen dieser abgeleiteten Metriken verwenden die Metriken flights.m_flight_departure_count und flights.m_flight_arrival_count, die beide die USING-Klausel angeben:

CREATE OR REPLACE SEMANTIC VIEW flights_derived_metrics_sv
  TABLES (
    flights PRIMARY KEY (flight_id),
    airports PRIMARY KEY (airport_code)
  ) RELATIONSHIPS (
    flight_departure_airport AS flights(departure_airport) REFERENCES airports(airport_code),
    flight_arrival_airport AS flights(arrival_airport) REFERENCES airports(airport_code)
  ) DIMENSIONS (
    airports.city_name AS city_name
  ) METRICS (
    flights.m_flight_count AS COUNT(flight_id),
    flights.m_flight_departure_count USING (flight_departure_airport) AS flights.m_flight_count,
    flights.m_flight_arrival_count USING (flight_arrival_airport) AS flights.m_flight_count,
    global_m_departure_arrival_ratio AS DIV0(flights.m_flight_departure_count, flights.m_flight_arrival_count),
    global_m_departure_arrival_sum AS flights.m_flight_departure_count + flights.m_flight_arrival_count
  );
SELECT * FROM SEMANTIC_VIEW (
  flights_derived_metrics_sv
  METRICS global_m_departure_arrival_ratio,
    flights.m_flight_arrival_count, flights.m_flight_departure_count
  DIMENSIONS airports.city_name
);
+------------------------+--------------------------+----------------------------------+--------------+
| M_FLIGHT_ARRIVAL_COUNT | M_FLIGHT_DEPARTURE_COUNT | GLOBAL_M_DEPARTURE_ARRIVAL_RATIO | CITY_NAME    |
|------------------------+--------------------------+----------------------------------+--------------|
|                      1 |                        2 |                         2.000000 | Seattle      |
|                      1 |                        2 |                         2.000000 | San Fransico |
|                      2 |                     NULL |                             NULL | Shanghai     |
+------------------------+--------------------------+----------------------------------+--------------+

Identifizieren der Dimensionen, die für eine Metrik nicht additiv sein sollen

In manchen Fällen sollte eine Metrik nicht über bestimmte Dimensionen hinweg aggregiert werden. In diesen Fällen können Sie die Dimensionen als nicht additiv markieren.

Erläuterungen zum Problem der Aggregation von Metriken über bestimmte Dimensionen hinweg

Angenommen, Sie haben eine Tabelle, die die Kontosalden der Giro- und Sparkonten der einzelnen Kunden für einen bestimmten Tag enthält.

CREATE OR REPLACE TABLE bank_accounts (
  customer_id VARCHAR,
  account_type VARCHAR,
  year NUMBER,
  month NUMBER,
  day NUMBER,
  balance NUMBER
);
INSERT INTO bank_accounts VALUES
  ('cust-001', 'checking', 2024, 01, 01, 100),
  ('cust-001', 'savings', 2024, 01, 01, 110),
  ('cust-001', 'checking', 2024, 02, 10, 140),
  ('cust-001', 'savings', 2024, 02, 10, 150),
  ('cust-001', 'checking', 2024, 03, 15, 200),
  ('cust-001', 'savings', 2024, 03, 30, 210),
  ('cust-001', 'checking', 2025, 02, 15, 280),
  ('cust-001', 'savings', 2025, 02, 15, 290),
  ('cust-001', 'checking', 2025, 03, 20, 300),
  ('cust-001', 'savings', 2025, 03, 20, 310),
  ('cust-002', 'checking', 2025, 03, 30, 200),
  ('cust-002', 'savings', 2025, 03, 30, 310);
SELECT * FROM bank_accounts;
+-------------+--------------+------+-------+-----+---------+
| CUSTOMER_ID | ACCOUNT_TYPE | YEAR | MONTH | DAY | BALANCE |
|-------------+--------------+------+-------+-----+---------|
| cust-001    | checking     | 2024 |     1 |   1 |     100 |
| cust-001    | savings      | 2024 |     1 |   1 |     110 |
| cust-001    | checking     | 2024 |     2 |  10 |     140 |
| cust-001    | savings      | 2024 |     2 |  10 |     150 |
| cust-001    | checking     | 2024 |     3 |  15 |     200 |
| cust-001    | savings      | 2024 |     3 |  30 |     210 |
| cust-001    | checking     | 2025 |     2 |  15 |     280 |
| cust-001    | savings      | 2025 |     2 |  15 |     290 |
| cust-001    | checking     | 2025 |     3 |  20 |     300 |
| cust-001    | savings      | 2025 |     3 |  20 |     310 |
| cust-002    | checking     | 2025 |     3 |  30 |     200 |
| cust-002    | savings      | 2025 |     3 |  30 |     310 |
+-------------+--------------+------+-------+-----+---------+

Angenommen, Sie möchten eine semantische Ansicht definieren, die Folgendes enthält:

  • Die folgenden Dimensionen:

    • Customer ID

    • Account type

    • Year

    • Month

    • Day

  • Eine Metrik für den Gesamtsaldo.

Die folgende Anweisung erstellt eine semantische Ansicht, die die oben aufgeführten Dimensionen und Metriken enthält:

CREATE OR REPLACE SEMANTIC VIEW bank_accounts_sv
  TABLES (
    bank_accounts
  )
  DIMENSIONS (
    bank_accounts.customer_id_dim AS bank_accounts.customer_id,
    bank_accounts.account_type_dim AS bank_accounts.account_type,
    bank_accounts.year_dim AS bank_accounts.year,
    bank_accounts.month_dim AS bank_accounts.month,
    bank_accounts.day_dim AS bank_accounts.day
  )
  METRICS (
    bank_accounts.m_account_balance AS SUM(balance)
  );

Wenn Sie den Gesamtsaldo der Giro- und Sparkonten für jeden Kunden zum Jahresende abrufen möchten, können Sie die semantische Ansicht für die m_account_balance-Metrik abfragen und die customer_id_dim- und year_dim-Dimensionen angeben.

Die m_account_balance-Metrik ist jedoch der tägliche Gesamtsaldo für jeden Kunden, da die Metrik nach den Datumsdimensionen aggregiert wird.

SELECT * FROM SEMANTIC_VIEW(
    bank_accounts_sv
    METRICS bank_accounts.m_account_balance
    DIMENSIONS customer_id_dim, year_dim
  )
  ORDER BY customer_id_dim, year_dim;
+-------------------+-----------------+----------+
| M_ACCOUNT_BALANCE | CUSTOMER_ID_DIM | YEAR_DIM |
|-------------------+-----------------+----------|
|               910 | cust-001        |     2024 |
|              1180 | cust-001        |     2025 |
|               510 | cust-002        |     2025 |
+-------------------+-----------------+----------+

Im obigen Beispiel ist für cust-001 im Jahr 2024 910 der Gesamtsaldo für jeden Tag (100 + 110 + 140 + 150 + 200 + 210).

Verhindern, dass eine Metrik über bestimmte Dimensionen aggregiert wird

Um zu verhindern, dass die Metrik durch die Datumsdimensionen aggregiert wird, geben Sie die Datumsdimensionen in derNON ADDITIVE BY-Klausel beim Erstellen der semantischen Ansicht an:

CREATE OR REPLACE SEMANTIC VIEW bank_accounts_sv
  TABLES (
    bank_accounts
  )
  DIMENSIONS (
    bank_accounts.customer_id_dim AS bank_accounts.customer_id,
    bank_accounts.account_type_dim AS bank_accounts.account_type,
    bank_accounts.year_dim AS bank_accounts.year,
    bank_accounts.month_dim AS bank_accounts.month,
    bank_accounts.day_dim AS bank_accounts.day
  )
  METRICS (
    bank_accounts.m_account_balance
      NON ADDITIVE BY (year_dim, month_dim, day_dim)
      AS SUM(balance)
  );

Bemerkung

  • Wenn Sie die NON ADDITIVE BY-Klausel in einer Metrik angeben, können Sie sich in den Definitionen von Metriken, die nicht abgeleitet sind, nicht auf diese Metrik beziehen. Nur abgeleitete Metriken können sich auf Metriken beziehen, die nicht additive Dimensionen angeben.

Durch Angeben der NON ADDITIVE BY-Klausel wird die Kennzahl zu einer semi-additiven Kennzahl.

Wenn Sie diese semantische Ansicht abfragen, wird die m_account_balance-Metrik nicht mehr nach den Datumsdimensionen aggregiert. Die Abfrage aggregiert die Kontensalden am Ende des Zeitraums in jeder Gruppe von abgefragten Dimensionen.

SELECT * FROM SEMANTIC_VIEW(
    bank_accounts_sv
    METRICS bank_accounts.m_account_balance
    DIMENSIONS customer_id_dim, year_dim
  )
  ORDER BY customer_id_dim, year_dim;
+-------------------+-----------------+----------+
| M_ACCOUNT_BALANCE | CUSTOMER_ID_DIM | YEAR_DIM |
|-------------------+-----------------+----------|
|               210 | cust-001        |     2024 |
|               610 | cust-001        |     2025 |
|               510 | cust-002        |     2025 |
+-------------------+-----------------+----------+

Im obigen Beispiel ist für cust-001 im Jahr 2024 210 der Gesamtsaldo von Giro- und Sparkonten für den letzten Tag des Jahres, das Daten enthält:

  • Der letzte Tag im Jahr 2024, der Daten enthält, ist der 2024-03-30.

  • Es gibt keine Zeile mit diesem Datum für das Giro-Konto, sodass die resultierende Metrik der Saldo des Sparkontos ist (210).

Wenn Sie als weiteres Beispiel nur den Gesamtsaldo des Kontos für alle Kunden am Ende des Jahres wünschen, können Sie die year_dim-Dimension angeben.

Da die Datumsdimensionen als nicht additiv markiert sind, summiert die Abfrage die Werte am Ende des Zeitraums (nach Datum) für die Salden der Giro- und Sparkonten jedes Kunden.

SELECT * FROM SEMANTIC_VIEW(
    bank_accounts_sv
    METRICS bank_accounts.m_account_balance
    DIMENSIONS year_dim
  )
  ORDER BY year_dim;
+-------------------+----------+
| M_ACCOUNT_BALANCE | YEAR_DIM |
|-------------------+----------|
|               210 |     2024 |
|               510 |     2025 |
+-------------------+----------+

Während der Abfrageverarbeitung werden die Zeilen nach den nicht additiven Dimensionen sortiert, und die Werte aus den letzten Zeilen (die neuesten Snapshots der Werte) werden aggregiert, um die Metrik zu berechnen.

Bemerkung

Da die Zeilen nach den nicht additiven Dimensionen sortiert sind, ist die Reihenfolge, in der Sie die Dimensionen angeben, wichtig. Dies ist vergleichbar mit der Reihenfolge, in der Sie die Spalten in der ORDER BY-Klausel angeben.

Festlegen der Sortierreihenfolge von nicht additiven Dimensionen

Wie im Beispiel gezeigt, aggregiert die Metrik die Werte der Salden der Giro- und Sparkonten für jeden Kunden am Ende eines Zeitraums. Wenn Sie die Sortierreihenfolge ändern möchten, können Sie das Schlüsselwort ASC oder DESC neben dem Dimensionsnamen angeben. Beispiel:

METRICS (
  bank_accounts.m_account_balance
    NON ADDITIVE BY (year_dim DESC, month_dim DESC, day_dim DESC)
    AS SUM(balance)
);

In diesem Beispiel ergibt die Metrik den frühesten Zeitpunkt, der durch year_dim, month_dim und day_dim angegeben wurde.

Wenn die Dimension NULL-Werte enthält, können Sie die Schlüsselwerte NULLS FIRST oder NULLS LAST verwenden, um anzugeben, obNULL-Werte in den Ergebnissen zuerst oder zuletzt sortiert werden :

METRICS (
  bank_accounts.m_account_balance
    NON ADDITIVE BY (
      year_dim DESC NULLS FIRST,
      month_dim DESC NULLS FIRST,
      day_dim DESC NULLS FIRST
    )
    AS SUM(balance)

Tatsache oder Metrik als privat markieren

Wenn Sie einen Fakt oder eine Kennzahl nur zur Verwendung in Berechnungen in der semantischen Ansicht definieren und nicht möchten, dass der Fakt oder die Kennzahl in einer Abfrage zurückgegeben werden, können Sie das Schlüsselwort PRIVATE angeben, um die Tatsache oder Kennzahl als privat zu markieren. Beispiel:

FACTS (
  PRIVATE my_private_fact AS ...
)

METRICS (
  PRIVATE my_private_metric AS ...
)

Bemerkung

Sie können eine Dimension nicht als privat markieren. Dimensionen sind immer öffentlich.

Wenn Sie eine semantische Ansicht abfragen, die private Fakten oder Metriken enthält, können Sie in den folgenden Klauseln keine privaten Fakten oder Metriken angeben:

Einige Befehle und Funktionen beinhalten private Fakten und Kennzahlen:

Einige Befehle und Funktionen enthalten private Fakten und Metriken nur unter bestimmten Bedingungen:

Andere Befehle und Funktionen enthalten keine privaten Fakten und Metriken:

Bereitstellung kundenspezifischer Anweisungen für Cortex Analyst

In einer semantischen Ansicht können Sie Anweisungen für Cortex Analyst angeben, die Folgendes erklären:

  • SQL-Anweisung generieren

  • Fragen klassifizieren und zusätzliche Informationen einfordern

Um diese benutzerdefinierten Anweisungen bereitzustellen, verwenden Sie die folgenden Klauseln:

  • Für eine Anleitung zum Generieren der SQL-Anweisung verwenden Sie die AI_SQL_GENERATION-Klausel im Befehl CREATE SEMANTIC VIEW.

    Um zum Beispiel Cortex Analyst anzuweisen, die SQL-Anweisung zu generieren, sodass alle numerischen Spalten auf zwei Dezimalstellen gerundet werden, geben Sie Folgendes an:

    CREATE SEMANTIC VIEW my_semantic_view
      ...
      -- Definitions of logical tables, relationships, dimensions, facts, and metrics
      ...
      AI_SQL_GENERATION 'Ensure that all numeric columns are rounded to 2 decimal points.'
      ...
      -- Additional clauses
    
  • Für eine Anleitung zum Klassifizieren von Fragen verwenden Sie die AI_QUESTION_CATEGORIZATION-Klausel.

    Um zum Beispiel Cortex Analyst anzuweisen, Fragen zu Benutzern abzulehnen, geben Sie Folgendes an:

    CREATE SEMANTIC VIEW my_semantic_view
      ...
      -- Definitions of logical tables, relationships, dimensions, facts, and metrics
      ...
      AI_QUESTION_CATEGORIZATION 'Reject all questions asking about users. Ask users to contact their admin.'
      ...
      -- Additional clauses
    

    Sie können auch Anweisungen geben, nach weiteren Details zu fragen, wenn die Frage nicht klar ist. Beispiel:

    AI_QUESTION_CATEGORIZATION 'If the question asks for users without providing a product_type, consider this question UNCLEAR and ask the user to specify product_type.'
    

Semantischen Ansicht aus einer YAML-Spezifikation erstellen

Um eine semantischen Ansicht anhand einer YAML-Spezifikation zu erstellen, können Sie die gespeicherte Prozedur SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML aufrufen.

Übergeben Sie zuerst TRUE als drittes Argument, um zu verifizieren, ob Sie die semantische Ansicht aus derYAML-Spezifikation erstellen können.

Das folgende Beispiel bestätigt, dass Sie eine bestimmte Spezifikation eines semantischen Modells in YAML verwenden können, um eine semantische Ansicht namens tpch_analysis in der Datenbank my_db und im Schema my_schema zu erstellen:

CALL SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML(
  'my_db.my_schema',
  $$
  name: TPCH_REV_ANALYSIS
  description: Semantic view for revenue analysis
  tables:
    - name: CUSTOMERS
      description: Main table for customer data
      base_table:
        database: SNOWFLAKE_SAMPLE_DATA
        schema: TPCH_SF1
        table: CUSTOMER
      primary_key:
        columns:
          - C_CUSTKEY
      dimensions:
        - name: CUSTOMER_NAME
          synonyms:
            - customer name
          description: Name of the customer
          expr: customers.c_name
          data_type: VARCHAR(25)
        - name: C_CUSTKEY
          expr: C_CUSTKEY
          data_type: VARCHAR(134217728)
      metrics:
        - name: CUSTOMER_COUNT
          description: Count of number of customers
          expr: COUNT(c_custkey)
    - name: LINE_ITEMS
      description: Line items in orders
      base_table:
        database: SNOWFLAKE_SAMPLE_DATA
        schema: TPCH_SF1
        table: LINEITEM
      primary_key:
        columns:
          - L_ORDERKEY
          - L_LINENUMBER
      dimensions:
        - name: L_ORDERKEY
          expr: L_ORDERKEY
          data_type: VARCHAR(134217728)
        - name: L_LINENUMBER
          expr: L_LINENUMBER
          data_type: VARCHAR(134217728)
      facts:
        - name: DISCOUNTED_PRICE
          description: Extended price after discount
          expr: l_extendedprice * (1 - l_discount)
          data_type: "NUMBER(25,4)"
        - name: LINE_ITEM_ID
          expr: "CONCAT(l_orderkey, '-', l_linenumber)"
          data_type: VARCHAR(134217728)
    - name: ORDERS
      synonyms:
        - sales orders
      description: All orders table for the sales domain
      base_table:
        database: SNOWFLAKE_SAMPLE_DATA
        schema: TPCH_SF1
        table: ORDERS
      primary_key:
        columns:
          - O_ORDERKEY
      dimensions:
        - name: ORDER_DATE
          description: Date when the order was placed
          expr: o_orderdate
          data_type: DATE
        - name: ORDER_YEAR
          description: Year when the order was placed
          expr: YEAR(o_orderdate)
          data_type: "NUMBER(4,0)"
        - name: O_ORDERKEY
          expr: O_ORDERKEY
          data_type: VARCHAR(134217728)
        - name: O_CUSTKEY
          expr: O_CUSTKEY
          data_type: VARCHAR(134217728)
      facts:
        - name: COUNT_LINE_ITEMS
          expr: COUNT(line_items.line_item_id)
          data_type: "NUMBER(18,0)"
      metrics:
        - name: AVERAGE_LINE_ITEMS_PER_ORDER
          description: Average number of line items per order
          expr: AVG(orders.count_line_items)
        - name: ORDER_AVERAGE_VALUE
          description: Average order value across all orders
          expr: AVG(orders.o_totalprice)
  relationships:
    - name: LINE_ITEM_TO_ORDERS
      left_table: LINE_ITEMS
      right_table: ORDERS
      relationship_columns:
        - left_column: L_ORDERKEY
          right_column: O_ORDERKEY
      relationship_type: many_to_one
    - name: ORDERS_TO_CUSTOMERS
      left_table: ORDERS
      right_table: CUSTOMERS
      relationship_columns:
        - left_column: O_CUSTKEY
          right_column: C_CUSTKEY
      relationship_type: many_to_one
  $$,
TRUE);

Wenn die Spezifikation gültig ist, gibt die gespeicherte Prozedur die folgende Meldung zurück:

+----------------------------------------------------------------------------------+
| SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML                                            |
|----------------------------------------------------------------------------------|
| YAML file is valid for creating a semantic view. No object has been created yet. |
+----------------------------------------------------------------------------------+

Wenn die YAML-Syntax ungültig ist, löst die gespeicherte Prozedur eine Ausnahme aus. Wenn zum Beispiel ein Doppelpunkt fehlt:

relationships
  - name: LINE_ITEM_TO_ORDERS

Die gespeicherte Prozedur löst eine Ausnahme aus, die anzeigt, dass die YAML-Syntax ungültig ist:

392400 (22023): Uncaught exception of type 'EXPRESSION_ERROR' on line 3 at position 23 :
  Invalid semantic model YAML: while scanning a simple key
   in 'reader', line 90, column 3:
        relationships
        ^
  could not find expected ':'
   in 'reader', line 91, column 11:
          - name: LINE_ITEM_TO_ORDERS
                ^

Wenn sich die Spezifikation auf eine physische Tabelle bezieht, die nicht existiert, löst die gespeicherte Prozedur eine Ausnahme aus:

base_table:
  database: SNOWFLAKE_SAMPLE_DATA
  schema: TPCH_SF1
  table: NONEXISTENT
002003 (42S02): Uncaught exception of type 'EXPRESSION_ERROR' on line 3 at position 23 :
  SQL compilation error:
  Table 'SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NONEXISTENT' does not exist or not authorized.

In ähnlicher Weise löst der gespeicherte Prozess eine Ausnahme aus, wenn sich die Spezifikation auf eine Primärschlüsselspalte bezieht, die nicht existiert:

primary_key:
  columns:
    - NONEXISTENT
000904 (42000): Uncaught exception of type 'EXPRESSION_ERROR' on line 3 at position 23 :
  SQL compilation error: error line 0 at position -1
  invalid identifier 'NONEXISTENT'

Sie können dann den gespeicherten Prozess aufrufen, ohne das dritte Argument zu übergeben, um die semantische Ansicht zu erstellen.

Im folgenden Beispiel wird eine semantische Ansicht namens tpch_analysis in der Datenbank my_db und im Schema my_schema erstellt:

CALL SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML(
  'my_db.my_schema',
  $$
  name: TPCH_REV_ANALYSIS
  description: Semantic view for revenue analysis
  tables:
    - name: CUSTOMERS
      description: Main table for customer data
      base_table:
        database: SNOWFLAKE_SAMPLE_DATA
        schema: TPCH_SF1
        table: CUSTOMER
      primary_key:
        columns:
          - C_CUSTKEY
      dimensions:
        - name: CUSTOMER_NAME
          synonyms:
            - customer name
          description: Name of the customer
          expr: customers.c_name
          data_type: VARCHAR(25)
        - name: C_CUSTKEY
          expr: C_CUSTKEY
          data_type: VARCHAR(134217728)
      metrics:
        - name: CUSTOMER_COUNT
          description: Count of number of customers
          expr: COUNT(c_custkey)
    - name: LINE_ITEMS
      description: Line items in orders
      base_table:
        database: SNOWFLAKE_SAMPLE_DATA
        schema: TPCH_SF1
        table: LINEITEM
      primary_key:
        columns:
          - L_ORDERKEY
          - L_LINENUMBER
      dimensions:
        - name: L_ORDERKEY
          expr: L_ORDERKEY
          data_type: VARCHAR(134217728)
        - name: L_LINENUMBER
          expr: L_LINENUMBER
          data_type: VARCHAR(134217728)
      facts:
        - name: DISCOUNTED_PRICE
          description: Extended price after discount
          expr: l_extendedprice * (1 - l_discount)
          data_type: "NUMBER(25,4)"
        - name: LINE_ITEM_ID
          expr: "CONCAT(l_orderkey, '-', l_linenumber)"
          data_type: VARCHAR(134217728)
    - name: ORDERS
      synonyms:
        - sales orders
      description: All orders table for the sales domain
      base_table:
        database: SNOWFLAKE_SAMPLE_DATA
        schema: TPCH_SF1
        table: ORDERS
      primary_key:
        columns:
          - O_ORDERKEY
      dimensions:
        - name: ORDER_DATE
          description: Date when the order was placed
          expr: o_orderdate
          data_type: DATE
        - name: ORDER_YEAR
          description: Year when the order was placed
          expr: YEAR(o_orderdate)
          data_type: "NUMBER(4,0)"
        - name: O_ORDERKEY
          expr: O_ORDERKEY
          data_type: VARCHAR(134217728)
        - name: O_CUSTKEY
          expr: O_CUSTKEY
          data_type: VARCHAR(134217728)
      facts:
        - name: COUNT_LINE_ITEMS
          expr: COUNT(line_items.line_item_id)
          data_type: "NUMBER(18,0)"
      metrics:
        - name: AVERAGE_LINE_ITEMS_PER_ORDER
          description: Average number of line items per order
          expr: AVG(orders.count_line_items)
        - name: ORDER_AVERAGE_VALUE
          description: Average order value across all orders
          expr: AVG(orders.o_totalprice)
  relationships:
    - name: LINE_ITEM_TO_ORDERS
      left_table: LINE_ITEMS
      right_table: ORDERS
      relationship_columns:
        - left_column: L_ORDERKEY
          right_column: O_ORDERKEY
      relationship_type: many_to_one
    - name: ORDERS_TO_CUSTOMERS
      left_table: ORDERS
      right_table: CUSTOMERS
      relationship_columns:
        - left_column: O_CUSTKEY
          right_column: C_CUSTKEY
      relationship_type: many_to_one
  $$
);
+-----------------------------------------+
| SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML   |
|-----------------------------------------|
| Semantic view was successfully created. |
+-----------------------------------------+

Kommentar für eine bestehende semantische Ansicht ändern

Um den Kommentar für eine bestehende semantische Ansicht zu ändern, führen Sie den Befehl ALTER SEMANTIC VIEW aus. Beispiel:

ALTER SEMANTIC VIEW my_semantic_view SET COMMENT = 'my comment';

Bemerkung

Sie können den Befehl ALTER SEMANTIC VIEW verwenden, um andere Eigenschaften als den Kommentar zu ändern. Um andere Eigenschaften der semantischen Ansicht zu ändern, ersetzen Sie die semantische Ansicht. Siehe Ersetzen einer bestehenden semantischen Ansicht.

Sie können auch den Befehl COMMENT verwenden, um einen Kommentar für eine semantische Ansicht festzulegen:

COMMENT ON SEMANTIC VIEW my_semantic_view IS 'my comment';

Ersetzen einer bestehenden semantischen Ansicht

Um eine bestehende semantische Ansicht zu ersetzen (z. B. um die Definition der Ansicht zu ändern), geben Sie OR REPLACE an, wenn Sie CREATE SEMANTIC VIEW ausführen. Wenn Sie die Berechtigungen für die bestehende semantische Ansicht beibehalten wollen, geben Sie COPY GRANTS an. Beispiel:

CREATE OR REPLACE SEMANTIC VIEW tpch_rev_analysis

  TABLES (
    orders AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
      PRIMARY KEY (o_orderkey)
      WITH SYNONYMS ('sales orders')
      COMMENT = 'All orders table for the sales domain',
    customers AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER
      PRIMARY KEY (c_custkey)
      COMMENT = 'Main table for customer data',
    line_items AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.LINEITEM
      PRIMARY KEY (l_orderkey, l_linenumber)
      COMMENT = 'Line items in orders'
  )

  RELATIONSHIPS (
    orders_to_customers AS
      orders (o_custkey) REFERENCES customers,
    line_item_to_orders AS
      line_items (l_orderkey) REFERENCES orders
  )

  FACTS (
    line_items.line_item_id AS CONCAT(l_orderkey, '-', l_linenumber),
    orders.count_line_items AS COUNT(line_items.line_item_id),
    line_items.discounted_price AS l_extendedprice * (1 - l_discount)
      COMMENT = 'Extended price after discount'
  )

  DIMENSIONS (
    customers.customer_name AS customers.c_name
      WITH SYNONYMS = ('customer name')
      COMMENT = 'Name of the customer',
    orders.order_date AS o_orderdate
      COMMENT = 'Date when the order was placed',
    orders.order_year AS YEAR(o_orderdate)
      COMMENT = 'Year when the order was placed'
  )

  METRICS (
    customers.customer_count AS COUNT(c_custkey)
      COMMENT = 'Count of number of customers',
    orders.order_average_value AS AVG(orders.o_totalprice)
      COMMENT = 'Average order value across all orders',
    orders.average_line_items_per_order AS AVG(orders.count_line_items)
      COMMENT = 'Average number of line items per order'
  )

  COMMENT = 'Semantic view for revenue analysis and different comment'
  COPY GRANTS;

Auflistung semantischer Ansichten

Um semantische Ansichten im aktuellen Schema oder in einem bestimmten Schema aufzulisten, führen Sie den Befehl SHOW SEMANTIC VIEWS aus. Beispiel:

SHOW SEMANTIC VIEWS;
+-------------------------------+-----------------------+---------------+-------------------+----------------------------------------------+-----------------+-----------------+-----------+
| created_on                    | name                  | database_name | schema_name       | comment                                      | owner           | owner_role_type | extension |
|-------------------------------+-----------------------+---------------+-------------------+----------------------------------------------+-----------------+-----------------+-----------|
| 2025-03-20 15:06:34.039 -0700 | MY_NEW_SEMANTIC_MODEL | MY_DB         | MY_SCHEMA         | A semantic model created through the wizard. | MY_ROLE         | ROLE            | ["CA"]    |
| 2025-02-28 16:16:04.002 -0800 | O_TPCH_SEMANTIC_VIEW  | MY_DB         | MY_SCHEMA         | NULL                                         | MY_ROLE         | ROLE            | NULL      |
| 2025-03-21 07:03:54.120 -0700 | TPCH_REV_ANALYSIS     | MY_DB         | MY_SCHEMA         | Semantic view for revenue analysis           | MY_ROLE         | ROLE            | NULL      |
+-------------------------------+-----------------------+---------------+-------------------+----------------------------------------------+-----------------+-----------------+-----------+

Die Ausgabe des Befehls SHOW OBJECTS enthält semantische Ansichten. In der Spalte kind wird der Objekttyp als VIEW aufgeführt. Beispiel:

SHOW OBJECTS LIKE '%TPCH_ANALYSIS%' IN SCHEMA;
+-------------------------------+---------------+---------------+-------------+------+---------+------------+------+-------+---------+----------------+-----------------+-----------+------------+------------+
| created_on                    | name          | database_name | schema_name | kind | comment | cluster_by | rows | bytes | owner   | retention_time | owner_role_type | is_hybrid | is_dynamic | is_iceberg |
|-------------------------------+---------------+---------------+-------------+------+---------+------------+------+-------+---------+----------------+-----------------+-----------+------------+------------|
| 2025-10-03 16:28:01.505 -0700 | TPCH_ANALYSIS | MY_DB         | MY_SCHEMA   | VIEW |         |            |    0 |     0 | MY_ROLE | 1              | ROLE            | N         | N          | N          |
+-------------------------------+---------------+---------------+-------------+------+---------+------------+------+-------+---------+----------------+-----------------+-----------+------------+------------+

Sie können auch die Ansichten für semantische Ansichten in den Schemas ACCOUNT_USAGE und INFORMATION_SCHEMA abfragen.

Dimensionen, Fakten und Metriken auflisten

Um die Dimensionen, Fakten und Metriken aufzulisten, die in einer Ansicht, einem Schema, einer Datenbank oder einem Konto verfügbar sind, können Sie die folgenden Befehle ausführen:

Standardmäßig listen die Befehle die Dimensionen, Fakten und Metriken auf, die in semantischen Ansichten verfügbar sind, die im aktuellen Schema definiert sind:

SHOW SEMANTIC DIMENSIONS;
+---------------+-------------+--------------------+------------+---------------+--------------+-------------------+--------------------------------+
| database_name | schema_name | semantic_view_name | table_name | name          | data_type    | synonyms          | comment                        |
|---------------+-------------+--------------------+------------+---------------+--------------+-------------------+--------------------------------|
| MY_DB         | MY_SCHEMA   | TPCH_REV_ANALYSIS  | CUSTOMERS  | CUSTOMER_NAME | VARCHAR(25)  | ["customer name"] | Name of the customer           |
| MY_DB         | MY_SCHEMA   | TPCH_REV_ANALYSIS  | CUSTOMERS  | C_CUSTKEY     | NUMBER(38,0) | NULL              | NULL                           |
...
SHOW SEMANTIC FACTS;
+---------------+-------------+--------------------+------------+------------------+--------------------+----------+-------------------------------+
| database_name | schema_name | semantic_view_name | table_name | name             | data_type          | synonyms | comment                       |
|---------------+-------------+--------------------+------------+------------------+--------------------+----------+-------------------------------|
| MY_DB         | MY_SCHEMA   | TPCH_REV_ANALYSIS  | LINE_ITEMS | DISCOUNTED_PRICE | NUMBER(25,4)       | NULL     | Extended price after discount |
| MY_DB         | MY_SCHEMA   | TPCH_REV_ANALYSIS  | LINE_ITEMS | LINE_ITEM_ID     | VARCHAR(134217728) | NULL     | NULL                          |
...
SHOW SEMANTIC METRICS;
+---------------+-------------+--------------------+------------+------------------------------+--------------+----------+----------------------------------------+
| database_name | schema_name | semantic_view_name | table_name | name                         | data_type    | synonyms | comment                                |
|---------------+-------------+--------------------+------------+------------------------------+--------------+----------+----------------------------------------|
| MY_DB         | MY_SCHEMA   | TPCH_REV_ANALYSIS  | CUSTOMERS  | CUSTOMER_COUNT               | NUMBER(18,0) | NULL     | Count of number of customers           |
| MY_DB         | MY_SCHEMA   | TPCH_REV_ANALYSIS  | ORDERS     | AVERAGE_LINE_ITEMS_PER_ORDER | NUMBER(36,6) | NULL     | Average number of line items per order |
...

Die folgenden Beispiele zeigen, wie Sie die Dimensionen, Fakten und Metriken für semantische Ansichten mit unterschiedlichen Geltungsbereichen auflisten:

  • Auflisten der Dimensionen, Fakten und Metriken in semantischen Ansichten der aktuellen Datenbank:

    SHOW SEMANTIC DIMENSIONS IN DATABASE;
    
    SHOW SEMANTIC FACTS IN DATABASE;
    
    SHOW SEMANTIC METRICS IN DATABASE;
    
  • Auflisten der Dimensionen, Fakten und Metriken in semantischen Ansichten in einem bestimmten Schema oder einer bestimmten Datenbank:

    SHOW SEMANTIC DIMENSIONS IN SCHEMA my_db.my_other_schema;
    
    SHOW SEMANTIC DIMENSIONS IN DATABASE my_db;
    
    SHOW SEMANTIC FACTS IN SCHEMA my_db.my_other_schema;
    
    SHOW SEMANTIC FACTS IN DATABASE my_db;
    
    SHOW SEMANTIC METRICS IN SCHEMA my_db.my_other_schema;
    
    SHOW SEMANTIC METRICS IN DATABASE my_db;
    
  • Auflisten der Dimensionen, Fakten und Metriken in semantischen Ansichten im Konto:

    SHOW SEMANTIC DIMENSIONS IN ACCOUNT;
    
    SHOW SEMANTIC FACTS IN ACCOUNT;
    
    SHOW SEMANTIC METRICS IN ACCOUNT;
    
  • Auflisten der Dimensionen, Fakten und Metriken in einer bestimmten semantischen Ansicht:

    SHOW SEMANTIC DIMENSIONS IN my_semantic_view;
    
    SHOW SEMANTIC FACTS IN my_semantic_view;
    
    SHOW SEMANTIC METRICS IN my_semantic_view;
    

Wenn Sie eine semantische Ansicht abfragen, können Sie den Befehl SHOW SEMANTIC DIMENSIONS FOR METRIC verwenden, um zu bestimmen, welche Dimensionen Sie bei Angabe einer bestimmten Kennzahl zurückgeben können. Weitere Details dazu finden Sie unter Auswahl der Dimensionen, die Sie für eine bestimmte Metrik zurückgeben können.

Wenn Sie den Befehl SHOW COLUMNS für eine semantische Ansicht ausführen, enthält die Ausgabe die Dimensionen, Fakten und Metriken der semantischen Ansicht. Die Spalte kind zeigt an, ob die Zeile eine Dimension, ein Fakt oder eine Metrik darstellt.

Beispiel:

SHOW COLUMNS IN VIEW my_db.my_schema.tpch_analysis;
+---------------+-------------+------------------------------+-----------------------------------------------------------------------------------------+----------+---------+-----------+------------+---------+---------------+---------------+-------------------------+
| table_name    | schema_name | column_name                  | data_type                                                                               | null?    | default | kind      | expression | comment | database_name | autoincrement | schema_evolution_record |
|---------------+-------------+------------------------------+-----------------------------------------------------------------------------------------+----------+---------+-----------+------------+---------+---------------+---------------+-------------------------|
| TPCH_ANALYSIS | MY_SCHEMA   | CUSTOMER_COUNT               | {"type":"FIXED","precision":18,"scale":0,"nullable":false}                              | NOT_NULL |         | METRIC    |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | CUSTOMER_COUNTRY_CODE        | {"type":"TEXT","length":15,"byteLength":60,"nullable":true,"fixed":false}               | true     |         | DIMENSION |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | CUSTOMER_MARKET_SEGMENT      | {"type":"TEXT","length":10,"byteLength":40,"nullable":true,"fixed":false}               | true     |         | DIMENSION |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | CUSTOMER_NAME                | {"type":"TEXT","length":25,"byteLength":100,"nullable":true,"fixed":false}              | true     |         | DIMENSION |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | CUSTOMER_NATION_NAME         | {"type":"TEXT","length":25,"byteLength":100,"nullable":true,"fixed":false}              | true     |         | DIMENSION |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | CUSTOMER_ORDER_COUNT         | {"type":"FIXED","precision":30,"scale":0,"nullable":true}                               | true     |         | METRIC    |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | CUSTOMER_REGION_NAME         | {"type":"TEXT","length":25,"byteLength":100,"nullable":true,"fixed":false}              | true     |         | DIMENSION |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | C_CUSTOMER_ORDER_COUNT       | {"type":"FIXED","precision":18,"scale":0,"nullable":false}                              | NOT_NULL |         | FACT      |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | LINE_ITEM_ID                 | {"type":"TEXT","length":134217728,"byteLength":134217728,"nullable":true,"fixed":false} | true     |         | FACT      |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | NATION_NAME                  | {"type":"TEXT","length":25,"byteLength":100,"nullable":true,"fixed":false}              | true     |         | DIMENSION |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | N_NAME                       | {"type":"TEXT","length":25,"byteLength":100,"nullable":true,"fixed":false}              | true     |         | FACT      |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | AVERAGE_LINE_ITEMS_PER_ORDER | {"type":"FIXED","precision":36,"scale":6,"nullable":true}                               | true     |         | METRIC    |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | COUNT_LINE_ITEMS             | {"type":"FIXED","precision":18,"scale":0,"nullable":false}                              | NOT_NULL |         | FACT      |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | ORDER_AVERAGE_VALUE          | {"type":"FIXED","precision":30,"scale":8,"nullable":true}                               | true     |         | METRIC    |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | ORDER_COUNT                  | {"type":"FIXED","precision":18,"scale":0,"nullable":false}                              | NOT_NULL |         | METRIC    |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | ORDER_DATE                   | {"type":"DATE","nullable":true}                                                         | true     |         | DIMENSION |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | O_ORDERKEY                   | {"type":"FIXED","precision":38,"scale":0,"nullable":true}                               | true     |         | FACT      |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | R_NAME                       | {"type":"TEXT","length":25,"byteLength":100,"nullable":true,"fixed":false}              | true     |         | FACT      |            |         | MY_DB         |               | NULL                    |
| TPCH_ANALYSIS | MY_SCHEMA   | SUPPLIER_COUNT               | {"type":"FIXED","precision":18,"scale":0,"nullable":false}                              | NOT_NULL |         | METRIC    |            |         | MY_DB         |               | NULL                    |
+---------------+-------------+------------------------------+-----------------------------------------------------------------------------------------+----------+---------+-----------+------------+---------+---------------+---------------+-------------------------+

Details zu einer semantischen Ansicht anzeigen

Um die Details einer semantischen Ansicht anzuzeigen, führen Sie den Befehl DESCRIBE SEMANTIC VIEW aus. Beispiel:

DESCRIBE SEMANTIC VIEW tpch_rev_analysis;
+--------------+------------------------------+---------------+--------------------------+----------------------------------------+
| object_kind  | object_name                  | parent_entity | property                 | property_value                         |
|--------------+------------------------------+---------------+--------------------------+----------------------------------------|
| NULL         | NULL                         | NULL          | COMMENT                  | Semantic view for revenue analysis     |
| TABLE        | CUSTOMERS                    | NULL          | BASE_TABLE_DATABASE_NAME | SNOWFLAKE_SAMPLE_DATA                  |
| TABLE        | CUSTOMERS                    | NULL          | BASE_TABLE_SCHEMA_NAME   | TPCH_SF1                               |
| TABLE        | CUSTOMERS                    | NULL          | BASE_TABLE_NAME          | CUSTOMER                               |
| TABLE        | CUSTOMERS                    | NULL          | PRIMARY_KEY              | ["C_CUSTKEY"]                          |
| TABLE        | CUSTOMERS                    | NULL          | COMMENT                  | Main table for customer data           |
| DIMENSION    | CUSTOMER_NAME                | CUSTOMERS     | TABLE                    | CUSTOMERS                              |
| DIMENSION    | CUSTOMER_NAME                | CUSTOMERS     | EXPRESSION               | customers.c_name                       |
| DIMENSION    | CUSTOMER_NAME                | CUSTOMERS     | DATA_TYPE                | VARCHAR(25)                            |
| DIMENSION    | CUSTOMER_NAME                | CUSTOMERS     | SYNONYMS                 | ["customer name"]                      |
| DIMENSION    | CUSTOMER_NAME                | CUSTOMERS     | COMMENT                  | Name of the customer                   |
| TABLE        | LINE_ITEMS                   | NULL          | BASE_TABLE_DATABASE_NAME | SNOWFLAKE_SAMPLE_DATA                  |
| TABLE        | LINE_ITEMS                   | NULL          | BASE_TABLE_SCHEMA_NAME   | TPCH_SF1                               |
| TABLE        | LINE_ITEMS                   | NULL          | BASE_TABLE_NAME          | LINEITEM                               |
| TABLE        | LINE_ITEMS                   | NULL          | PRIMARY_KEY              | ["L_ORDERKEY","L_LINENUMBER"]          |
| TABLE        | LINE_ITEMS                   | NULL          | COMMENT                  | Line items in orders                   |
| RELATIONSHIP | LINE_ITEM_TO_ORDERS          | LINE_ITEMS    | TABLE                    | LINE_ITEMS                             |
| RELATIONSHIP | LINE_ITEM_TO_ORDERS          | LINE_ITEMS    | REF_TABLE                | ORDERS                                 |
| RELATIONSHIP | LINE_ITEM_TO_ORDERS          | LINE_ITEMS    | FOREIGN_KEY              | ["L_ORDERKEY"]                         |
| RELATIONSHIP | LINE_ITEM_TO_ORDERS          | LINE_ITEMS    | REF_KEY                  | ["O_ORDERKEY"]                         |
| FACT         | DISCOUNTED_PRICE             | LINE_ITEMS    | TABLE                    | LINE_ITEMS                             |
| FACT         | DISCOUNTED_PRICE             | LINE_ITEMS    | EXPRESSION               | l_extendedprice * (1 - l_discount)     |
| FACT         | DISCOUNTED_PRICE             | LINE_ITEMS    | DATA_TYPE                | NUMBER(25,4)                           |
| FACT         | DISCOUNTED_PRICE             | LINE_ITEMS    | COMMENT                  | Extended price after discount          |
| FACT         | LINE_ITEM_ID                 | LINE_ITEMS    | TABLE                    | LINE_ITEMS                             |
| FACT         | LINE_ITEM_ID                 | LINE_ITEMS    | EXPRESSION               | CONCAT(l_orderkey, '-', l_linenumber)  |
| FACT         | LINE_ITEM_ID                 | LINE_ITEMS    | DATA_TYPE                | VARCHAR(134217728)                     |
| TABLE        | ORDERS                       | NULL          | BASE_TABLE_DATABASE_NAME | SNOWFLAKE_SAMPLE_DATA                  |
| TABLE        | ORDERS                       | NULL          | BASE_TABLE_SCHEMA_NAME   | TPCH_SF1                               |
| TABLE        | ORDERS                       | NULL          | BASE_TABLE_NAME          | ORDERS                                 |
| TABLE        | ORDERS                       | NULL          | SYNONYMS                 | ["sales orders"]                       |
| TABLE        | ORDERS                       | NULL          | PRIMARY_KEY              | ["O_ORDERKEY"]                         |
| TABLE        | ORDERS                       | NULL          | COMMENT                  | All orders table for the sales domain  |
| RELATIONSHIP | ORDERS_TO_CUSTOMERS          | ORDERS        | TABLE                    | ORDERS                                 |
| RELATIONSHIP | ORDERS_TO_CUSTOMERS          | ORDERS        | REF_TABLE                | CUSTOMERS                              |
| RELATIONSHIP | ORDERS_TO_CUSTOMERS          | ORDERS        | FOREIGN_KEY              | ["O_CUSTKEY"]                          |
| RELATIONSHIP | ORDERS_TO_CUSTOMERS          | ORDERS        | REF_KEY                  | ["C_CUSTKEY"]                          |
| METRIC       | AVERAGE_LINE_ITEMS_PER_ORDER | ORDERS        | TABLE                    | ORDERS                                 |
| METRIC       | AVERAGE_LINE_ITEMS_PER_ORDER | ORDERS        | EXPRESSION               | AVG(orders.count_line_items)           |
| METRIC       | AVERAGE_LINE_ITEMS_PER_ORDER | ORDERS        | DATA_TYPE                | NUMBER(36,6)                           |
| METRIC       | AVERAGE_LINE_ITEMS_PER_ORDER | ORDERS        | COMMENT                  | Average number of line items per order |
| FACT         | COUNT_LINE_ITEMS             | ORDERS        | TABLE                    | ORDERS                                 |
| FACT         | COUNT_LINE_ITEMS             | ORDERS        | EXPRESSION               | COUNT(line_items.line_item_id)         |
| FACT         | COUNT_LINE_ITEMS             | ORDERS        | DATA_TYPE                | NUMBER(18,0)                           |
| METRIC       | ORDER_AVERAGE_VALUE          | ORDERS        | TABLE                    | ORDERS                                 |
| METRIC       | ORDER_AVERAGE_VALUE          | ORDERS        | EXPRESSION               | AVG(orders.o_totalprice)               |
| METRIC       | ORDER_AVERAGE_VALUE          | ORDERS        | DATA_TYPE                | NUMBER(30,8)                           |
| METRIC       | ORDER_AVERAGE_VALUE          | ORDERS        | COMMENT                  | Average order value across all orders  |
| DIMENSION    | ORDER_DATE                   | ORDERS        | TABLE                    | ORDERS                                 |
| DIMENSION    | ORDER_DATE                   | ORDERS        | EXPRESSION               | o_orderdate                            |
| DIMENSION    | ORDER_DATE                   | ORDERS        | DATA_TYPE                | DATE                                   |
| DIMENSION    | ORDER_DATE                   | ORDERS        | COMMENT                  | Date when the order was placed         |
| DIMENSION    | ORDER_YEAR                   | ORDERS        | TABLE                    | ORDERS                                 |
| DIMENSION    | ORDER_YEAR                   | ORDERS        | EXPRESSION               | YEAR(o_orderdate)                      |
| DIMENSION    | ORDER_YEAR                   | ORDERS        | DATA_TYPE                | NUMBER(4,0)                            |
| DIMENSION    | ORDER_YEAR                   | ORDERS        | COMMENT                  | Year when the order was placed         |
+--------------+------------------------------+---------------+--------------------------+----------------------------------------+

Abrufen der SQL-Anweisung für eine semantische Ansicht

Sie können die Funktion GET_DDL aufrufen, um die DDL-Anweisung abzurufen, mit der eine semantische Ansicht erstellt wurde.

Bemerkung

Um diese Funktion für eine semantische Ansicht aufzurufen, müssen Sie eine Rolle verwenden, der die folgenden Berechtigungen gewährt wurden: REFERENCES oder OWNERSHIP. Dies muss in der semantischen Ansicht erfolgen.

Wenn Sie GET_DDL aufrufen, geben Sie 'SEMANTIC_VIEW' als Objekttyp an. Beispiel:

SELECT GET_DDL('SEMANTIC_VIEW', 'tpch_rev_analysis', TRUE);
+-----------------------------------------------------------------------------------+
| GET_DDL('SEMANTIC_VIEW', 'TPCH_REV_ANALYSIS', TRUE)                               |
|-----------------------------------------------------------------------------------|
| create or replace semantic view DYOSHINAGA_DB.DYOSHINAGA_SCHEMA.TPCH_REV_ANALYSIS |
|     tables (                                                                                                                                                                       |
|             ORDERS primary key (O_ORDERKEY) with synonyms=('sales orders') comment='All orders table for the sales domain',                                                                                                                                                                       |
|             CUSTOMERS as CUSTOMER primary key (C_CUSTKEY) comment='Main table for customer data',                                                                                                                                                                       |
|             LINE_ITEMS as LINEITEM primary key (L_ORDERKEY,L_LINENUMBER) comment='Line items in orders'                                                                                                                                                                       |
|     )                                                                                                                                                                       |
|     relationships (                                                                                                                                                                       |
|             ORDERS_TO_CUSTOMERS as ORDERS(O_CUSTKEY) references CUSTOMERS(C_CUSTKEY),                                                                                                                                                                       |
|             LINE_ITEM_TO_ORDERS as LINE_ITEMS(L_ORDERKEY) references ORDERS(O_ORDERKEY)                                                                                                                                                                       |
|     )                                                                                                                                                                       |
|     facts (                                                                                                                                                                       |
|             ORDERS.COUNT_LINE_ITEMS as COUNT(line_items.line_item_id),                                                                                                                                                                       |
|             LINE_ITEMS.DISCOUNTED_PRICE as l_extendedprice * (1 - l_discount) comment='Extended price after discount',                                                                                                                                                                       |
|             LINE_ITEMS.LINE_ITEM_ID as CONCAT(l_orderkey, '-', l_linenumber)                                                                                                                                                                       |
|     )                                                                                                                                                                       |
|     dimensions (                                                                                                                                                                       |
|             ORDERS.ORDER_DATE as o_orderdate comment='Date when the order was placed',                                                                                                                                                                       |
|             ORDERS.ORDER_YEAR as YEAR(o_orderdate) comment='Year when the order was placed',                                                                                                                                                                       |
|             CUSTOMERS.CUSTOMER_NAME as customers.c_name with synonyms=('customer name') comment='Name of the customer'                                                                                                                                                                       |
|     )                                                                                                                                                                       |
|     metrics (                                                                                                                                                                       |
|             ORDERS.AVERAGE_LINE_ITEMS_PER_ORDER as AVG(orders.count_line_items) comment='Average number of line items per order',                                                                                                                                                                       |
|             ORDERS.ORDER_AVERAGE_VALUE as AVG(orders.o_totalprice) comment='Average order value across all orders'                                                                                                                                                                       |
|     );                                                                                                                                                                       |
+-----------------------------------------------------------------------------------+

Der Rückgabewert enthält private Fakten und Metriken (Fakten und Metriken, die mit dem Schlüsselwort PRIVATE markiert sind).

YAML-Spezifikation für eine semantische Ansicht abrufen

Um die YAML-Spezifikation für eine semantische Ansicht zu erhalten, rufen Sie die Funktion SYSTEM$READ_YAML_FROM_SEMANTIC_VIEW auf.

Das folgende Beispiel gibt die YAML-Spezifikation für die semantische Ansicht namens``tpch_analysis`` in der Datenbank my_db und im Schema my_schema zurück:

SELECT SYSTEM$READ_YAML_FROM_SEMANTIC_VIEW(
  'my_db.my_schema.tpch_rev_analysis'
);
+-------------------------------------------------------------+
| READ_YAML_FROM_SEMANTIC_VIEW                                |
|-------------------------------------------------------------|
| name: TPCH_REV_ANALYSIS                                     |
| description: Semantic view for revenue analysis             |
| tables:                                                     |
|   - name: CUSTOMERS                                         |
|     description: Main table for customer data               |
|     base_table:                                             |
|       database: SNOWFLAKE_SAMPLE_DATA                       |
|       schema: TPCH_SF1                                      |
|       table: CUSTOMER                                       |
|     primary_key:                                            |
|       columns:                                              |
|         - C_CUSTKEY                                         |
|     dimensions:                                             |
|       - name: CUSTOMER_NAME                                 |
|         synonyms:                                           |
|           - customer name                                   |
|         description: Name of the customer                   |
|         expr: customers.c_name                              |
|         data_type: VARCHAR(25)                              |
|       - name: C_CUSTKEY                                     |
|         expr: C_CUSTKEY                                     |
|         data_type: VARCHAR(134217728)                       |
|   - name: LINE_ITEMS                                        |
|     description: Line items in orders                       |
|     base_table:                                             |
|       database: SNOWFLAKE_SAMPLE_DATA                       |
|       schema: TPCH_SF1                                      |
|       table: LINEITEM                                       |
|     primary_key:                                            |
|       columns:                                              |
|         - L_ORDERKEY                                        |
|         - L_LINENUMBER                                      |
|     dimensions:                                             |
|       - name: L_ORDERKEY                                    |
|         expr: L_ORDERKEY                                    |
|         data_type: VARCHAR(134217728)                       |
|       - name: L_LINENUMBER                                  |
|         expr: L_LINENUMBER                                  |
|         data_type: VARCHAR(134217728)                       |
|     facts:                                                  |
|       - name: DISCOUNTED_PRICE                              |
|         description: Extended price after discount          |
|         expr: l_extendedprice * (1 - l_discount)            |
|         data_type: "NUMBER(25,4)"                           |
|       - name: LINE_ITEM_ID                                  |
|         expr: "CONCAT(l_orderkey, '-', l_linenumber)"       |
|         data_type: VARCHAR(134217728)                       |
|   - name: ORDERS                                            |
|     synonyms:                                               |
|       - sales orders                                        |
|     description: All orders table for the sales domain      |
|     base_table:                                             |
|       database: SNOWFLAKE_SAMPLE_DATA                       |
|       schema: TPCH_SF1                                      |
|       table: ORDERS                                         |
|     primary_key:                                            |
|       columns:                                              |
|         - O_ORDERKEY                                        |
|     dimensions:                                             |
|       - name: ORDER_DATE                                    |
|         description: Date when the order was placed         |
|         expr: o_orderdate                                   |
|         data_type: DATE                                     |
|       - name: ORDER_YEAR                                    |
|         description: Year when the order was placed         |
|         expr: YEAR(o_orderdate)                             |
|         data_type: "NUMBER(4,0)"                            |
|       - name: O_ORDERKEY                                    |
|         expr: O_ORDERKEY                                    |
|         data_type: VARCHAR(134217728)                       |
|       - name: O_CUSTKEY                                     |
|         expr: O_CUSTKEY                                     |
|         data_type: VARCHAR(134217728)                       |
|     facts:                                                  |
|       - name: COUNT_LINE_ITEMS                              |
|         expr: COUNT(line_items.line_item_id)                |
|         data_type: "NUMBER(18,0)"                           |
|     metrics:                                                |
|       - name: AVERAGE_LINE_ITEMS_PER_ORDER                  |
|         description: Average number of line items per order |
|         expr: AVG(orders.count_line_items)                  |
|       - name: ORDER_AVERAGE_VALUE                           |
|         description: Average order value across all orders  |
|         expr: AVG(orders.o_totalprice)                      |
| relationships:                                              |
|   - name: LINE_ITEM_TO_ORDERS                               |
|     left_table: LINE_ITEMS                                  |
|     right_table: ORDERS                                     |
|     relationship_columns:                                   |
|       - left_column: L_ORDERKEY                             |
|         right_column: O_ORDERKEY                            |
|   - name: ORDERS_TO_CUSTOMERS                               |
|     left_table: ORDERS                                      |
|     right_table: CUSTOMERS                                  |
|     relationship_columns:                                   |
|       - left_column: O_CUSTKEY                              |
|         right_column: C_CUSTKEY                             |
|                                                             |
+-------------------------------------------------------------+

Exportieren einer semantischen Ansicht in eine Datei der Tableau-Datenquelle (TDS)

Um eine semantische Ansicht in eine Datei der Tableau-Datenquelle (TDS) zu exportieren, rufen Sie die SYSTEM$EXPORT_TDS_FROM_SEMANTIC_VIEW-Funktion auf.

Das folgende Beispiel gibt den Inhalt der TDS-Datei für die semantische Ansicht my_sv_for_export zurück:

SELECT SYSTEM$EXPORT_TDS_FROM_SEMANTIC_VIEW('my_sv_for_export');
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SYSTEM$EXPORT_TDS_FROM_SEMANTIC_VIEW('MY_SV_FOR_EXPORT')                                                                                                                                                                                                              |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| <?xml version="1.0" encoding="UTF-8"?>                                                                                                                                                                                                                                |
| <!--Tableau compatibility notice:                                                                                                                                                                                                                                     |
| - Generated TDS schema version 18.1 is validated against Tableau Desktop 2025.2                                                                                                                                                                                       |
| - Connection customization schema version 1 enables CAP_* settings to take effect.                                                                                                                                                                                    |
| - Update these versions if your Tableau client requires a different schema.-->                                                                                                                                                                                        |
| <!--Dimensions and measures with duplicated names [DUPLICATE_DIM] are not shown in the TDS file-->                                                                                                                                                                    |
| <datasource xmlns:user="http://www.tableausoftware.com/xml/user" formatted-name="federated.0484db64fcbd48d89e8af86a62" inline="true" version="18.1">                                                                                                                  |
|   <document-format-change-manifest>                                                                                                                                                                                                                                   |
| ...                                                                                                                                 |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Kopieren Sie das XML in eine .tds-Datei, und öffnen Sie die Datei in Tableau Desktop.

Tableau Desktop zeigt für jede logische Tabelle in der Ordnerliste auf der linken Seite einen Ordner an. Die Namen der Ordner verwenden Leerzeichen anstelle von Unterstrichen, und jedes Wort beginnt mit einem Großbuchstaben. Beispiel: Der Name des Ordners für die logische Tabelle date_dim ist Date Dim.

Jeder Ordner enthält Tableau-Dimensionen und -Kennzahlen, die den Dimensionen, Fakten und Metriken in der semantischen Ansicht entsprechen.

In den nächsten Abschnitten finden Sie weitere Details und die Beschränkungen für den Konvertierungsprozess:

Über die Konvertierung

Die Funktion konvertiert Dimensionen, Fakten und Metriken in der semantischen Ansicht in die folgenden Äquivalenten in der Tableau-TDS-Datei.

Element in der semantischen Ansicht

Tableau-Äquivalent (Dimension oder Kennzahl)

Wie die Daten aggregiert werden

Dimension

Dimension

  • Für Werte von numerischen Dimensionen wird SUM verwendet.

  • Datumsdimensionen werden nach Jahr aggregiert.

  • Für andere Dimensionstypen wird COUNT verwendet.

Numerischer Fakt

Maßnahme

SUM

Nicht-numerischer Fakt

Dimension

  • Datumsdimensionen werden nach Jahr aggregiert.

  • Für andere Dimensionstypen wird COUNT verwendet.

Numerische Metrik

Maßnahme

In der TDS-Datei wird anstelle der Metrik ein berechnetes Feld verwendet. Das berechnete Feld übergibt den Wert der Metrik an die AGG-Funktion von Snowflake.

Nicht-numerische Metrik

Dimension

  • Datumsdimensionen werden nach Jahr aggregiert.

  • Für andere Dimensionstypen wird COUNT verwendet.

Numerische abgeleitete Metrik

Maßnahme

In der TDS-Datei wird anstelle der Metrik ein berechnetes Feld verwendet. Das berechnete Feld übergibt den Wert der Metrik an die AGG-Funktion von Snowflake.

Nicht-numerische abgeleitete Metrik

Dimension

  • Datumsdimensionen werden nach Jahr aggregiert.

  • Für andere Dimensionstypen wird COUNT verwendet.

Die folgenden Snowflake-Datentypen werden den entsprechenden Tableau-TDS-Datentypen zugeordnet:

Snowflake-Datentyp

Äquivalenter Tableau-Datentyp

NUMBER/FIXED (wenn die Skalierung größer als 0 ist)

real

NUMBER/FIXED (wenn die Skalierung 0 oder null ist)

Ganzzahl

FLOAT oder DECFLOAT

real

STRING oder BINARY

string

BOOLEAN

boolean

TIME

time

DATE

date

DATETIME oder TIMESTAMP

datetime

GEOGRAPHY

spatial

Semistrukturiert (VARIANT, OBJECT, ARRAY), strukturiert (ARRAY, OBJECT, MAP), unstrukturiert (FILE), GEOMETRY, UUID, VECTOR

string

Die TDS-Datei weist die folgenden Funktionen, die für die Verbindung zu Snowflake angepasst sind:

Name der Anpassung

Wert

Auswirkung der Anpassung

CAP_ODBC_METADATA_SUPPRESS_EXECUTED_QUERY

yes

Verhindert, dass Tableau tatsächlich eine Abfrage wie SELECT * FROM table WHERE 1=0 ausführt, um Spaltennamen anzuzeigen.

CAP_ODBC_METADATA_SUPPRESS_PREPARED_QUERY

yes

Verhindert, dass Tableau eine Anweisung „vorbereitet“ (sie an Snowflake sendet, um sie ohne Ausführung zu parsen), um Datentypen zu ermitteln.

CAP_ODBC_METADATA_SUPPRESS_SELECT_STAR

yes

Verhindert, dass Tableau eine SELECT *-Abfrage zum Lesen von Metadaten verwendet.

CAP_ODBC_METADATA_SUPPRESS_SQLCOLUMNS_API

no

Erzwingt, dass Tableau die ODBC-Standardfunktion SQLColumns aktiviert und verwendet, um Spalteninformationen über die semantische Ansicht zurückzugeben. Diese Spalteninformationen umfassen die Namen, Datentypen und die Genauigkeit der Spalten.

CAP_DISABLE_ESCAPE_UNDERSCORE_IN_CATALOG

yes

Verhindert, dass Tableau bei der Suche nach dem Datenbanknamen Unterstriche mit Escapezeichen maskiert.

Beschränkungen bei der Verwendung einer semantischen Ansicht in Tableau Desktop

Die folgenden Beschränkungen gelten für semantische Ansichten in Tableau Desktop:

  • Sie können keinen Extrakt aus einer semantischen Ansicht erstellen.

    Wenn Sie Ihre Verbindung von Live in Extract ändern, schlägt Tableau Desktop mit dem folgenden Fehler fehl:

    SQL compilation error:
    Requested semantic expression 'XXX' in FACTS clause must be one of the following types: (DIMENSION, FACT).
    Unable to create extract
    
  • Sie können das Feld Measure Values nicht in einer semantischen Ansicht verwenden.

    Wenn Sie das Feld Measure Values in einer semantischen Ansicht auswählen, meldet Tableau Desktop den folgenden Fehler:

    Unable to complete action
    
    Error Code: B9F09DDB
    SQL compilation error: error line 1 at position 7
    Invalid metric expression 'SUM(1)'.
    
  • Sie können das Feld Count nicht in einer semantischen Ansicht auswählen.

    Wenn Sie SemanticViewName(Count) auswählen, meldet Tableau Desktop den folgenden Fehler:

    Unable to complete action
    
    Error Code: B9F09DDB
    SQL compilation error: error line 1 at position 7
    Invalid metric expression 'SUM(1)'.
    

    Tableau Desktop kann die Anzahl der Zeilen in der semantischen Ansicht nicht zurückgeben, da die Anzahl der Zeilen abhängig von den in der Abfrage angegebenen Dimensionen, Fakten und Metriken variieren kann.

  • Sie können einen Kennzahl selbst nicht ziehen.

    Wenn Sie einen Kennzahl ziehen, meldet Tableau Desktop den folgenden Fehler:

    Unable to complete action
    
    Error Code: B9F09DDB
    SQL compilation error: error line 3 at position 8
    Invalid metric expression 'COUNT(1)'.
    
  • Sie können eine nicht-numerische Metrik nicht direkt verwenden.

    SYSTEM$EXPORT_TDS_FROM_SEMANTIC_VIEW konvertiert nicht-numerische Metriken in Dimensionen in Tableau. Wenn Sie versuchen, eine dieser Dimensionen zu verwenden, meldet Tableau Desktop den folgenden Fehler:

    Unable to complete action
    
    Error Code: B9F09DDB
    SQL compilation error:
    Requested semantic expression 'CUSTOMER.MIN_NAME' in DIMENSIONS clause must be one of the following types: (DIMENSION, FACT).
    

    Um dies zu umgehen, konvertieren Sie die Dimension in einen Kennzahl:

    1. Klicken Sie mit der rechten Maustaste auf die Dimension, und wählen Sie Convert to Measure aus.

      Dies konvertiert die Dimension unter Verwendung der Standardaggregation Count (Distinct) in eine Kennzahl.

    2. Um eine andere Aggregation zu verwenden, klicken Sie mit der rechten Maustaste auf die konvertierten Kennzahl, wählen Sie Default Properties`|ra|:extui:`Aggregations und dann die Aggregation aus, die Sie verwenden möchten.

Semantische Ansicht umbenennen

Um eine semantische Ansicht umzubenennen, führen Sie ALTER SEMANTIC VIEW … RENAME TO … aus. Beispiel:

ALTER SEMANTIC VIEW sv RENAME TO sv_new_name;

Entfernen einer semantischen Ansicht

Um eine semantische Ansicht zu entfernen, führen Sie den Befehl DROP SEMANTIC VIEW aus. Beispiel:

DROP SEMANTIC VIEW tpch_rev_analysis;

Erteilung von Berechtigungen für semantische Ansichten

Berechtigungen für semantische Ansichten listet die Berechtigungen auf, die Sie für eine semantische Ansicht gewähren können.

Die folgenden Berechtigungen für eine semantische Ansicht sind erforderlich, um mit der Ansicht zu arbeiten:

  • Jede Berechtigung (z. B. MONITOR, REFERENCES oder SELECT) für eine Ansicht muss den Befehl DESCRIBE SEMANTIC VIEW in der Ansicht ausführen.

  • Für eine Ansicht sind alle Berechtigungen erforderlich, um diese Ansicht in der Ausgabe des Befehls SHOW SEMANTIC VIEWS anzuzeigen.

  • SELECT ist erforderlich, um die semantische Ansicht abzufragen.

Bemerkung

Um eine semantische Ansicht abzufragen, benötigen Sie die SELECT-Berechtigung für die in der semantischen Ansicht verwendeten Tabellen nicht. Sie benötigen die SELECT-Berechtigung nur für die semantische Ansicht selbst.

Dieses Verhalten ist konsistent mit den Berechtigungen, die zum Abfragen von Standardansichten erforderlich sind.

Um eine semantische Ansicht zu verwenden, die Sie nicht in Cortex Analyst besitzen, müssen Sie eine Rolle verwenden, die über die Berechtigungen REFERENCES und SELECT für diese Ansicht verfügt.

Um die Berechtigungen REFERENCES und SELECT für eine semantische Ansicht zu erteilen, verwenden Sie den Befehl GRANT <Berechtigungen> … TO ROLE. Um z. B. die Berechtigungen REFERENCES und SELECT für die semantische Ansicht namens my_semantic_view der Rolle my_analyst_role zuzuweisen, können Sie die folgende Anweisung ausführen:

GRANT REFERENCES, SELECT ON SEMANTIC VIEW my_semantic_view TO ROLE my_analyst_role;

Wenn Sie ein Schema haben, das semantische Ansichten enthält, die Sie mit Cortex Analyst-Benutzern gemeinsam nutzen möchten, können Sie zukünftige Berechtigungen verwenden, um die Berechtigungen für jede semantische Ansicht zu gewähren, die Sie in diesem Schema erstellen. Beispiel:

GRANT REFERENCES, SELECT ON FUTURE SEMANTIC VIEWS IN SCHEMA my_schema TO ROLE my_analyst_role;