Utiliser des commandes SQL pour créer et gérer des vues sémantiques

Cette rubrique explique comment utiliser les commandes SQL suivantes pour créer et gérer des vues sémantiques :

Cette rubrique explique également comment appeler la procédure stockée et la fonction suivantes pour créer une vue sémantique à partir d’une spécification YAML et obtenir la spécification d’une vue sémantique :

Privilèges requis pour créer ou remplacer une vue sémantique

Pour créer ou remplacer une vue sémantique, vous devez utiliser un rôle disposant des privilèges suivants :

  • CREATE SEMANTIC VIEW sur le schéma dans lequel vous créez la vue sémantique.

  • USAGE sur la base de données et le schéma dans lesquels vous créez la vue sémantique.

  • SELECT sur les tables et les vues utilisées dans la vue sémantique.

Pour plus d’informations sur les privilèges exigés pour interroger une vue sémantique, voir Privilèges requis pour interroger une vue sémantique.

Création d’une vue sémantique à l’aide de la commande CREATE SEMANTIC VIEW

Pour créer une vue sémantique, utilisez la commande CREATE SEMANTIC VIEW.

Note

Pour créer une vue sémantique à partir d’une spécification YAML, appelez la procédure stockée SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML.

La vue sémantique doit être valide. Voir Comment Snowflake valide les vues sémantiques.

L’exemple suivant utilise les données d’échantillon TPC-H disponibles dans Snowflake. Cet ensemble de données contient des tables qui représentent un scénario commercial simplifié avec des clients, des commandes et des éléments de ligne.

Modèle de données des tables utilisées dans l'échantillon de données TPC-H

L’exemple crée une vue sémantique nommée tpch_rev_analysis en utilisant les tables de l’ensemble de données TPC-H. La vue sémantique définit :

  • Trois tables logiques (orders, customers et line_items).

  • Une relation entre les tables orders et customers.

  • Une relation entre les tables line_items et orders.

  • Des faits qui seront utilisés pour calculer les métriques.

  • Des dimensions pour le nom du client, la date de la commande et l’année au cours de laquelle la commande a été passée.

  • Les métriques correspondant à la valeur moyenne d’une commande et au nombre de lignes moyen d’une commande.

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';

Les sections suivantes expliquent cet exemple plus en détail :

Définir les tables logiques

Dans la commande CREATE SEMANTIC VIEW, utilisez la clause TABLES pour définir les tables logiques de la vue. Dans cette clause, vous pouvez :

  • Indiquer le nom de la table physique et un alias facultatif.

  • Identifiez les colonnes suivantes dans la table logique :

    • Les colonnes utilisées comme clés primaires.

    • Les colonnes qui contiennent des valeurs uniques (autres que les colonnes de clé primaire).

    Vous pouvez utiliser ces colonnes pour définir les relations dans cette vue sémantique.

  • Ajouter des synonymes pour la table (afin d’améliorer la découvrabilité).

  • Ajouter un commentaire descriptif.

Dans l”exemple présenté plus haut, la clause TABLES définit trois tables logiques :

  • Une table orders contenant les informations sur les commandes de la table TPC-H orders.

  • Une table customers contenant les informations sur les clients de la table TPC-H customers.

  • Une table line_items contenant les lignes des commandes de la table TPC-H lineitem.

L’exemple utilise la clause PRIMARY KEY pour identifier les colonnes à utiliser comme clés primaires pour chaque table logique. Les clés primaires et les valeurs uniques permettent de déterminer les types de relations entre les tables (par exemple, plusieurs à une ou une à une).

L’exemple fournit également des synonymes et des commentaires qui décrivent les tables logiques et facilitent la découverte des données.

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'
)

Identifier les relations entre les tables logiques

Dans la commande CREATE SEMANTIC VIEW, utilisez la clause RELATIONSHIPS pour identifier les relations entre les tables de la vue. Pour chaque relation, vous spécifiez :

  • Un nom facultatif pour la relation

  • Le nom de la table logique contenant la clé étrangère

  • Les colonnes de cette table qui définissent la clé étrangère

  • Le nom de la table logique contenant la clé primaire ou les colonnes à valeurs uniques

  • Les colonnes de cette table qui définissent la clé primaire ou qui contiennent des valeurs uniques.

    • Si vous avez déjà spécifié PRIMARY KEY pour la table logique dans la clause TABLES, vous n’avez pas besoin de spécifier la colonne de clé primaire dans la relation.

    • S’il existe un seul mot-clé UNIQUE pour la table logique dans la clause TABLES, vous n’avez pas besoin de spécifier les colonnes correspondantes dans la relation.

    Vous pouvez également spécifier une date, une heure, un horodatage ou une colonne numérique, si vous le souhaitez joindre les colonnes d’une plage.

Dans l”exemple présenté plus haut, la clause RELATIONSHIPS spécifie deux relations :

  • Une relation entre les tables orders et customers. Dans la table orders, o_custkey est la clé étrangère qui renvoie à la clé primaire de la table customers (c_custkey).

  • Une relation entre les tables line_items et orders. Dans la table line_items, l_orderkey est la clé étrangère qui renvoie à la clé primaire de la table orders (o_orderkey).

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

Utilisation d’une date, d’une heure, d’un horodatage ou d’une plage numérique pour joindre des tables logiques

Par défaut, lorsque vous spécifiez une relation entre deux tables logiques, les tables sont jointes selon une condition d’égalité.

Si vous devez joindre deux tables logiques sur une date, une heure, un horodatage ou une plage numérique (où les valeurs d’une colonne d’une table doivent se trouver dans la même plage que les valeurs d’une colonne d’une autre table), vous pouvez spécifier le mot clé ASOF avec le nom de colonne dans la clause REFERENCES :

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

Une requête de la vue sémantique définie ci-dessus produit une JOIN ASOF qui utilise l’opérateur de comparaison >= dans la clause MATCH_CONDITION. Ceci joint les deux tables de sorte que les valeurs de col_table_1 sont supérieures ou égales aux valeurs contenues dans la colonne col_table_2 :

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

Note

Aucun autre opérateur de comparaison de la clause MATCH_CONDITION n’est pris en charge.

Vous pouvez utiliser le mot clé ASOF pour les colonnes de mêmes types que vous pouvez utiliser avec une JOIN ASOF.

Note

Vous pouvez spécifier au maximum un mot clé ASOF dans la définition d’une relation donnée. Vous pouvez spécifier ce mot-clé avant n’importe quelle colonne de la liste.

Par exemple, supposons que vous ayez des tables contenant des données de client, d’adresse de client et de commande :

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);

Dans cet exemple, la table customer_address possède une colonne ca_start_date, qui indique quand le client a commencé à résider à l’adresse spécifiée. La table orders possède une colonne o_ord_date, qui est la date de la commande.

Supposons que vous souhaitiez pouvoir interroger des informations sur les commandes des clients et récupérer les codes postaux correspondant à l’endroit où réside le client lorsque les commandes ont été passées.

Vous pouvez définir une vue sémantique qui spécifie une jointure ASOF entre les colonnes ca_start_date et o_ord_date :

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)
  );

Supposons que vous interrogiez cette vue sémantique pour renvoyer la somme des montants de commande par mois pour chaque code postal :

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

La requête utilise effectivement une JOIN ASOF pour joindre les tables sur les colonnes de date, où la date de la commande est supérieure ou égale à la date de début de l’adresse :

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

Jointure de tables logiques contenant des plages de valeurs

Vous pouvez utiliser une jointure de plage lorsque vous souhaitez joindre une table à une autre table qui définit une plage de valeurs possibles dans la première table. Par exemple, supposons qu’une table représente les commandes client et possède une colonne avec l’horodatage de la commande. Supposons qu’une autre table représente les trimestres fiscaux et contienne les différentes plages de temps qui représentent ces trimestres. Vous pouvez créer une vue sémantique qui joint les deux tables de sorte que la ligne d’une commande inclue le trimestre fiscal au cours duquel la commande a été passée.

Dans la table qui contient les plages, chaque plage doit être distincte. Deux plages ne peuvent pas se chevaucher.

Dans les données de la table, si vous souhaitez spécifier la valeur la plus faible possible pour la plage ou la valeur la plus élevée possible pour la plage, utilisez NULL.

Par exemple, le tableau suivant définit un ensemble de plages de temps qui ne se chevauchent pas :

  • La première ligne couvre la plage qui inclut tout jusqu’au (mais non compris) 1er janvier 2024.

  • La dernière ligne couvre la plage qui inclut tout à partir du 20 mars 2024.

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

Note

Il ne peut pas y avoir deux lignes contenant NULL dans la colonne de départ, ni deux lignes contenant NULL dans la colonne de fin.

Pour de tels cas, vous pouvez mettre en place une vue sémantique qui prend en charge les requêtes de jointure de plage. Lorsque vous créez la vue sémantique, vous devez effectuer les opérations suivantes :

  1. Pour la table logique contenant les heures de début et de fin d’une période, définissez une contrainte qui spécifie que deux plages ne peuvent se chevaucher.

    Dans la clause TABLE de la commande CREATE SEMANTIC VIEW, spécifiez la clause CONSTRAINT dans la définition de la table logique. Pour la syntaxe, consultez la documentation pourCONSTRAINT dans la rubrique CREATE SEMANTIC VIEW.

  2. Définissez une relation entre la colonne contenant l’horodatage dans une table et les colonnes d’heure de début et de fin dans l’autre table.

    Dans la clause RELATIONSHIPS de la commande CREATE SEMANTIC VIEW, utilisez la clause BETWEEN pour spécifier les colonnes contenant les heures de début et de fin. Pour la syntaxe, consultez la documentation pourRELATIONSHIP dans la rubrique CREATE SEMANTIC VIEW.

Par exemple, supposons que la table my_time_periods définit des périodes de temps distinctes :

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);

Supposons que la table my_events capture les événements qui se sont produits au cours de ces périodes :

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);

Vous pouvez définir une vue sémantique qui joint les tables. Les lignes dans my_events sont jointes à des lignes dans my_time_periods, où la valeur dans la colonne event_timestamp dans my_events se situe dans la plage spécifiée par les colonnes start_time et end_time dans my_time_periods.

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(*)
  );

La requête suivante montre comment les lignes sont jointes :

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

Comme le montrent les exemples, la dimension dim_time_period_name pour chaque ligne des résultats correspond au nom de la période à laquelle appartient la dimension dim_event_timestamp.

Définir les faits, les dimensions et les métriques

Dans la commande CREATE SEMANTIC VIEW, utilisez les clauses FACTS, DIMENSIONS et METRICS pour définir les faits, les dimensions et les métriques de la vue sémantique.

Vous devez définir au moins une dimension ou une métrique dans la vue sémantique.

Pour chaque fait, dimension ou métrique, vous spécifiez :

Note

Si une métrique ne doit pas être agrégée selon des dimensions spécifiques, vous devez préciser que ces dimensions doivent être non additionnées.

Pour plus d’informations, voir Identification des dimensions qui doivent être non additionnées pour une métrique.

L”exemple présenté plus haut définit plusieurs faits, dimensions et mesures :

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'
)

Note

Pour des directives supplémentaires sur la définition des métriques qui utilisent des fonctions de fenêtre, voir Définition et requête des métriques des fonctions de fenêtre.

Définir une dimension qui utilise un Cortex Search Service

Pour définir une dimension qui utilise un Cortex Search Service, définissez la clause WITH CORTEX SEARCH SERVICE sur le nom du Cortex Search Service. Si le service se trouve dans une base de données ou un schéma différent, qualifier le nom du service. Par exemple :

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

Définition de métriques dérivées

Lorsque vous définissez une métrique, vous spécifiez le nom de la table logique à laquelle appartient la métrique. Il s’agit de la table logique sur laquelle la métrique est agrégée.

Si vous souhaitez définir une métrique basée sur des métriques provenant d’autres tables logiques, vous pouvez définir une métrique dérivée. Une métrique dérivée est une métrique qui est liée à la vue sémantique (plutôt qu’à une table logique spécifique). Une métrique dérivée peut combiner des métriques provenant de plusieurs tables logiques.

Dans la définition d’une métrique dérivée, omettez le nom de la table logique.

Par exemple, supposons que vous souhaitiez définir une métrique my_derived_metric_1 qui est la somme des métriques table_1.metric_1 et table_2.metric_2. Lorsque vous définissez my_derived_metric_1, ne lui donnez pas le nom d’une table logique :

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
  )
 ...

Vous pouvez utiliser d’autres métriques dérivées dans l’expression. Par exemple :

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
)

Notez les restrictions suivantes lorsque vous définissez une métrique dérivée :

  • Vous ne pouvez pas utiliser le même nom pour une métrique dérivée et une métrique ordinaire.

  • L’expression pour une métrique dérivée peut utiliser :

    • Agrégations de dimensions et de faits définis dans n’importe quelle table logique de la vue sémantique.

    • Expressions scalaires de métriques définies dans n’importe quelle table logique de la vue sémantique.

    • Autres métriques dérivées.

    Dans l’exemple suivant :

    • derived_metric_1 utilise une expression scalaire avec deux métriques.

    • derived_metric_2 utilise une agrégation d’une dimension.

    • derived_metric_3 ajoute une agrégation d’une dimension à une autre métrique dérivée.

    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
      )
      ...
    
  • Il n’est pas nécessaire d’utiliser le nom d’une métrique, d’une dimension ou d’un fait dans l’expression si le nom n’est pas ambigu. Par exemple :

    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
    )
    

    Remarque : le nom de la metric_1 doit contenir table_1, car il existe deux métriques nommées metric_1, mais my_unique_metric_name n’a pas besoin d’être utilisé, car le nom est unique.

  • Dans l’expression d’une métrique dérivée, vous ne pouvez pas utiliser les éléments suivants :

    • Agrégations de métriques.

    • Des fonctions de fenêtre.

    • Références aux colonnes physiques.

    • Références à des faits ou à des dimensions qui ne sont pas agrégés.

  • Vous ne pouvez pas utiliser une métrique dérivée dans l’expression pour une métrique, une dimension ou un fait ordinaire. Seule une autre métrique dérivée peut utiliser une métrique dérivée dans son expression.

Spécification de la relation pour une métrique lorsqu’il existe plusieurs chemins de relation

Dans certains cas, il peut exister plusieurs chemins de relation entre deux tables logiques spécifiques dans une vue sémantique. Dans ces cas, lorsque vous définissez une métrique, vous devez spécifier le chemin de la relation à utiliser.

Problème lié à plusieurs chemins de relation

Supposons que vous ayez deux tables contenant des informations sur les vols et les aéroports :

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

Supposons que vous définissiez une vue sémantique fournissant des informations sur le nombre total de vols au départ et à destination d’une ville spécifique :

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)
  );

La vue sémantique spécifie deux relations différentes entre la table flights et la table airports (flight_departure_airport et flight_arrival_airport). Comme il existe plusieurs chemins de relations entre les tables, l’interrogation de la métrique m_flight_count et la sélection de la dimension airports.city_name (ou de toute dimension dans la table airports) échoue :

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.

Comme il existe plusieurs chemins entre les tables flights et airports, la requête échoue. Si la requête n’avait pas sélectionné de dimension dans la table airports, la requête aurait abouti.

Spécification de la relation à utiliser

Dans la définition de la métrique dans la commande CREATE SEMANTIC VIEW, vous pouvez spécifier quelle relation utiliser dans la clause USING :

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

Note

  • Chaque relation que vous spécifiez doit commencer à partir de la table logique contenant la métrique. Par exemple, supposons que vous souhaitiez spécifier :

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

    La relation table_a_to_table_b doit commencer par``table_a`` :

    RELATIONSHIPS (
      table_a_to_table_b AS table_a(col_1) REFERENCES table_b(col_1)
      ...
    
  • Vous ne pouvez pas spécifier une séquence de relations (par exemple, table_a_to_table_b et table_b_to_table_c). Chaque relation doit commencer à partir de la table logique contenant la métrique.

  • Si vous devez identifier les relations de la table logique contenant la métrique avec différentes tables, vous pouvez spécifier les relations dans la clause USING. Par exemple, supposons que vous souhaitiez que la métrique soit calculée à partir de relations spécifiques entre table_a et table_b et entre table_a et table_c. Dans ce cas, vous spécifiez les deux relations dans la clause USING :

    METRICS (
      table_a.metric_a
        USING ( table_a_to_table_b, table_a_to_table_c )
        ...
    
  • Vous ne pouvez pas spécifier la clause USING dans une métrique dérivée.

Par exemple, l’instruction suivante définit deux métriques supplémentaires qui utilisent des relations spécifiques :

  • m_flight_departure_count, qui utilise la relation flight_departure_airport.

  • m_flight_arrival_count, qui utilise la relation flight_arrival_airport.

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
  );

Lorsque vous interrogez cette vue, vous pouvez spécifier les deux nouvelles métriques qui utilisent des relations spécifiques :

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

Ajouter des dimensions qui reposent sur les mêmes relations

La requête de l’exemple précédent utilisait la dimension airports.city_name, qui se trouve dans la table logique airports sur laquelle les relations sont basées.

Si vous ajoutez une dimension pour une table logique différente à la vue, les requêtes de cette dimension bénéficient des relations que vous avez spécifiées précédemment.

Par exemple, supposons que vous créiez une table nommée regions avec des informations supplémentaires sur les régions des aéroports spécifiés dans la colonne airport_region_code de la table airports :

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

Vous pouvez étendre la vue sémantique que vous avez définie précédemment pour renvoyer le nom de la région :

  • Ajoutez une nouvelle table logique pour la table regions.

  • Ajoutez une relation entre les tables regions et airports.

  • Ajoutez une dimension pour le nom de la région.

Vous n’avez pas besoin d’apporter des modifications supplémentaires à la clause USING pour les métriques, car il n’existe qu’une seule relation entre les tables regions et``airports``.

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
  );

Si vous interrogez la vue, en spécifiant la dimension region_name, et qu’il existe une ambiguïté sur la relation à utiliser, la clause USING détermine les relations à utiliser :

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

Spécifier des relations avec différentes tables

Si la vue sémantique utilise des dimensions provenant de plusieurs tables et que vous devez spécifier les relations à utiliser pour ces dimensions, vous pouvez spécifier plusieurs relations dans la clause USING.

Par exemple, supposons que vous créiez une table nommée``weather`` avec des informations météorologiques sur les aéroports dans la table 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 |
+--------------+-------------------+-------------------------+-------------------------+

Vous pouvez étendre la vue sémantique que vous avez définie précédemment pour renvoyer la condition météorologique :

  • Ajoutez une nouvelle table logique pour la table weather.

  • Ajoutez deux relations entre les tables weather et``flights`` (une pour les vols de départ et une pour les vols d’arrivée).

  • Ajoutez une dimension pour les informations météorologiques.

  • Spécifiez que les métriques doivent également utiliser les deux nouvelles relations entre les tables weather et flights.

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
  );

Lorsque vous interrogez la vue et que vous spécifiez la dimension weather_condition, la clause USING détermine les relations utilisées :

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

Définir des métriques dérivées basées sur des métriques qui utilisent des relations spécifiques

Bien que vous ne puissiez pas spécifier la clause USING dans une métrique dérivée, vous pouvez définir une métrique dérivée qui utilise des métriques qui spécifient la clause USING.

Par exemple, la vue sémantique suivante définit deux métriques dérivées :

  • global_m_departure_arrival_ratio

  • global_m_departure_arrival_sum

Les définitions de ces mesures dérivées utilisent les métriques flights.m_flight_departure_count et``flights.m_flight_arrival_count``, qui spécifient toutes les deux la clause USING :

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

Identification des dimensions qui doivent être non additionnées pour une métrique

Dans certains cas, une métrique ne doit pas être agrégée à travers des dimensions spécifiques. Dans ces cas-là, vous pouvez marquer les dimensions comme non additionnées.

Compréhension du problème lié à l’agrégation des métriques dans certaines dimensions

Supposons que vous disposiez d’une table contenant les soldes des comptes courants et d’épargne de chaque client un jour donné.

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

Supposons que vous souhaitiez définir une vue sémantique qui inclut :

  • Les dimensions suivantes :

    • ID client

    • Type de compte

    • Année

    • Mois

    • Jour

  • Une métrique pour la somme du solde.

L’instruction suivante crée une vue sémantique qui inclut les dimensions et les métriques répertoriées ci-dessus :

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)
  );

Si vous souhaitez récupérer le solde total des comptes courants et d’épargne pour chaque client à la fin de chaque année, vous pouvez interroger la vue sémantique pour la métrique m_account_balance et spécifier les dimensions customer_id_dim et year_dim.

Cependant, la métrique m_account_balance correspondra à la somme des soldes de chaque jour pour chaque client, car la métrique est agrégée par les dimensions de date.

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

Dans l’exemple ci-dessus, pour cust-001 en 2024, 910 est la somme des soldes pour chaque jour (100 + 110 + 140 + 150 + 200 + 210).

Prévention de l’agrégation d’une métrique à travers des dimensions spécifiques

Pour éviter que la métrique ne soit agrégée par les dimensions de date, spécifiez les dimensions de date dans la clause NON ADDITIVE BY lors de la création de la vue sémantique :

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)
  );

Note

  • Si vous spécifiez la clause NON ADDITIVE BY dans une métrique, vous ne pouvez pas faire référence à cette métrique dans les définitions des métriques qui ne sont pas dérivées. Seules les métriques dérivées peuvent faire référence aux métriques qui spécifient des dimensions non additionnées.

Spécifier la clause NON ADDITIVE BY fait de la métrique une métrique semi-additive.

Lorsque vous interrogez cette vue sémantique, la métrique m_account_balance n’est plus agrégée par les dimensions de date. La requête agrège les soldes des comptes à la fin de la période dans chaque groupe de dimensions interrogées.

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

Dans l’exemple ci-dessus, pour cust-001 en 2024, 210 correspond à la somme des soldes des comptes courants et d’épargne pour le dernier jour de l’année contenant des données :

  • Le dernier jour de 2024 contenant des données est 2024-03-30.

  • Il n’existe pas de ligne à cette date pour le compte courant, de sorte que la métrique résultante correspond au solde du compte d’épargne (210).

Autre exemple : si vous voulez simplement connaître le solde total des comptes pour tous les clients à la fin de l’année, vous pouvez spécifier la dimension year_dim.

Étant donné que les dimensions de date sont marquées comme non additionnées, la requête additionne les valeurs à la fin de la période (par date) pour les soldes des comptes courants et d’épargne de chaque client.

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

Pendant le traitement de la requête, les lignes sont triées par les dimensions non additionnées, et les valeurs des dernières lignes (les derniers instantanés des valeurs) sont agrégées pour calculer la métrique.

Note

Étant donné que les lignes sont triées par les dimensions non additionnées, l’ordre dans lequel vous spécifiez les dimensions est important. Ceci est similaire à l’ordre dans lequel vous spécifiez les colonnes dans la clause ORDER BY.

Spécification de l’ordre de tri pour les dimensions non additionnées

Comme montré dans l’exemple, la métrique agrège les valeurs des soldes courants et d’épargne pour chaque client à la fin d’une période. Si vous voulez modifier l’ordre de tri, vous pouvez spécifier le mot-clé ASC ou DESC à côté du nom de la dimension. Par exemple :

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

Dans cet exemple, la métrique est évaluée à la date la plus ancienne spécifiée par year_dim, month_dim et day_dim.

Si la dimension comprend des valeurs NULL, vous pouvez utiliser les mots-clés NULLS FIRST ou NULLS LAST pour spécifier si les valeurs NULL sont triées en premier ou en dernier dans les résultats :

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)

Marquer un fait ou une métrique comme privé

Si vous définissez un fait ou un indicateur uniquement pour une utilisation dans les calculs de la vue sémantique et que vous ne souhaitez pas que le fait ou la métrique soit renvoyé dans une requête, vous pouvez spécifier le mot-clé PRIVATE pour marquer le fait ou la métrique comme privé. Par exemple :

FACTS (
  PRIVATE my_private_fact AS ...
)

METRICS (
  PRIVATE my_private_metric AS ...
)

Note

Vous ne pouvez pas marquer une dimension comme privée. Les dimensions sont toujours publiques.

Lorsque vous interrogez une vue sémantique comportant des faits ou des métriques privés, vous ne pouvez pas spécifier de fait ou de métrique privé dans les clauses suivantes :

Certaines commandes et fonctions incluent des faits et des métriques privés :

Certaines commandes et fonctions incluent des faits et des métriques privés uniquement dans des conditions spécifiques :

Les autres commandes et fonctions n’incluent pas de faits et de métriques privés :

Fournir des instructions personnalisées pour Cortex Analyst

Dans une vue sémantique, vous pouvez fournir des instructions pour Cortex Analyst qui expliquent comment :

  • Générer l’instruction SQL

  • Classer les questions et demander des informations supplémentaires

Pour fournir ces instructions personnalisées, utilisez les clauses suivantes :

  • Pour obtenir des instructions sur la façon de générer l’instruction SQL, utilisez la clause AI_SQL_GENERATION dans la commande CREATE SEMANTIC VIEW.

    Par exemple, pour demander à Cortex Analyst de générer l’instruction SQL de sorte que toutes les colonnes numériques soient arrondies à deux décimales, spécifiez ce qui suit :

    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
    
  • Pour obtenir des instructions sur la manière de classer les questions, utilisez la clause AI_QUESTION_CATEGORIZATION.

    Par exemple, pour demander à Cortex Analyst de rejeter les questions sur les utilisateurs, spécifiez ce qui suit :

    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
    

    Vous pouvez également fournir des instructions pour demander plus de détails, si la question n’est pas claire. Par exemple :

    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.'
    

Création d’une vue sémantique à partir d’une spécification YAML

Pour créer une vue sémantique à partir d’une spécification YAML, vous pouvez appeler la procédure stockée SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML.

Tout d’abord, passez TRUE comme troisième argument pour vérifier que vous pouvez créer la vue sémantique à partir de la spécification YAML.

L’exemple suivant vérifie que vous pouvez utiliser une spécification de modèle sémantique donnée dans YAML pour créer une vue sémantique nommée tpch_analysis dans la base de données my_db et le schéma my_schema :

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);

Si la spécification est valide, la procédure stockée renvoie le message suivant :

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

Si la syntaxe YAML n’est pas valide, la procédure stockée lève une exception. Par exemple, s’il manque un deux-points :

relationships
  - name: LINE_ITEM_TO_ORDERS

la procédure stockée lève une exception, indiquant que la syntaxe YAML n’est pas valide :

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
                ^

Si la spécification fait référence à une table physique qui n’existe pas, la procédure stockée lève une exception :

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.

De même, si la spécification fait référence à une colonne de clé primaire qui n’existe pas, la procédure stockée lève une exception :

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'

Vous pouvez ensuite appeler la procédure stockée sans transmettre le troisième argument pour créer la vue sémantique.

L’exemple suivant crée une vue sémantique nommée tpch_analysis dans la base de données my_db et le schéma my_schema :

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

Modification du commentaire d’une vue sémantique existante

Pour modifier le commentaire d’une vue sémantique existante, exécutez la commande ALTER SEMANTIC VIEW. Par exemple :

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

Note

Vous ne pouvez pas utiliser la commande ALTER SEMANTIC VIEW pour modifier des propriétés autres que le commentaire. Pour modifier d’autres propriétés de la vue sémantique, remplacez la vue sémantique. Voir Remplacer une vue sémantique existante.

Vous pouvez également utiliser la commande COMMENT pour définir un commentaire pour une vue sémantique :

COMMENT ON SEMANTIC VIEW my_semantic_view IS 'my comment';

Remplacer une vue sémantique existante

Pour remplacer une vue sémantique existante (par exemple, pour modifier la définition de la vue), indiquez OR REPLACE lors de l’exécution de CREATE SEMANTIC VIEW. Si vous souhaitez préserver les privilèges accordés à la vue sémantique existante, indiquez COPY GRANTS. Par exemple :

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;

Lister les vues sémantiques

Pour répertorier les vues sémantiques du schéma actuel ou d’un schéma spécifié, exécutez la commande SHOW SEMANTIC VIEWS. Par exemple :

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

La sortie de la commande SHOW OBJECTS comprend des vues sémantiques. Dans la colonne kind, le type d’objet est répertorié comme VIEW. Par exemple :

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

Vous pouvez également interroger les vues sémantiques des schémas ACCOUNT_USAGE et INFORMATION_SCHEMA.

Liste des dimensions, faits et métriques

Pour répertorier les dimensions, les faits et les métriques disponibles dans une vue, un schéma, une base de données ou un compte, vous pouvez exécuter les commandes suivantes.

Par défaut, les commandes répertorient les dimensions ,les faits et les métriques disponibles dans les vues sémantiques définies dans le schéma actuel :

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

Les exemples suivants montrent comment dresser la liste des dimensions, des faits et des métriques pour des vues sémantiques dans différents champs d’application :

  • Répertorier les dimensions, les faits et les métriques dans les vues sémantiques de la base de données actuelle :

    SHOW SEMANTIC DIMENSIONS IN DATABASE;
    
    SHOW SEMANTIC FACTS IN DATABASE;
    
    SHOW SEMANTIC METRICS IN DATABASE;
    
  • Répertorier les dimensions, les faits et les métriques dans les vues sémantiques d’un schéma ou d’une base de données spécifique :

    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;
    
  • Répertorier les dimensions, les faits et les métriques dans les vues sémantiques du compte :

    SHOW SEMANTIC DIMENSIONS IN ACCOUNT;
    
    SHOW SEMANTIC FACTS IN ACCOUNT;
    
    SHOW SEMANTIC METRICS IN ACCOUNT;
    
  • Répertorier les dimensions, les faits et les métriques dans une vue sémantique spécifique :

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

Si vous interrogez une vue sémantique, vous pouvez utiliser la commande SHOW SEMANTIC DIMENSIONS FOR METRIC pour déterminer les dimensions que vous pouvez renvoyer lorsque vous spécifiez une métrique donnée. Pour plus de détails, voir Choix des dimensions que vous pouvez renvoyer pour une métrique donnée.

Lorsque vous exécutez la commande SHOW COLUMNS pour une vue sémantique, la sortie inclut les dimensions, les faits et les métriques de la vue sémantique. La colonne kind indique si la ligne représente une dimension, un fait ou une métrique.

Par exemple :

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

Afficher les détails d’une vue sémantique

Pour voir les détails d’une vue sémantique, exécutez la commande DESCRIBE SEMANTIC VIEW. Par exemple :

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

Récupérer l’instruction SQL correspondant à une vue sémantique

Vous pouvez appeler la fonction GET_DDL pour récupérer l’instruction DDL qui a créé une vue sémantique.

Note

Pour appeler cette fonction de vue sémantique, vous devez utiliser un rôle qui s’est vu accorder le privilège REFERENCES ou OWNERSHIP sur la vue sémantique.

Lorsque vous appelez GET_DDL, indiquez 'SEMANTIC_VIEW' comme type d’objet. Par exemple :

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'                                                                                                                                                                       |
|     );                                                                                                                                                                       |
+-----------------------------------------------------------------------------------+

La valeur de retour comprend faits et métriques privés (faits et métriques qui sont marqués avec le mot-clé PRIVATE).

Obtenir la spécification YAML pour une vue sémantique

Pour obtenir la spécification YAML pour une vue sémantique, appelez la fonction SYSTEM$READ_YAML_FROM_SEMANTIC_VIEW.

L’exemple suivant renvoie la spécification YAML pour la vue sémantique nommée tpch_analysis dans la base de données my_db et le schéma my_schema :

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

Exportation d’une vue sémantique vers un fichier Source de données Tableau (TDS)

Pour exporter une vue sémantique vers un fichier Source de données Tableau (TDS), appelez la fonction SYSTEM$EXPORT_TDS_FROM_SEMANTIC_VIEW.

L’exemple suivant renvoie le contenu du fichier TDS pour la vue sémantique my_sv_for_export :

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

Copiez le XML vers un fichier .tds et ouvrez le fichier dans Tableau Desktop.

Tableau Desktop affiche un dossier pour chaque table logique dans la liste des dossiers à gauche. Les noms des dossiers utilisent des espaces à la place des traits de soulignement, et chaque mot commence par une lettre majuscule. Par exemple, le nom de dossier de la table logique date_dim est Date Dim.

Chaque dossier contient des dimensions et des mesures Tableau qui correspondent aux dimensions, aux faits et aux métriques de la vue sémantique.

Les sections suivantes fournissent plus de détails et présentent les limites du processus de conversion :

À propos de la conversion

La fonction convertit les dimensions, les faits et les métriques de la vue sémantique en équivalents suivants dans le fichier Tableau TDS :

Élément dans la vue sémantique

Équivalent Tableau (dimension ou mesure)

Fonctionnement de l’agrégation des données

Dimension

Dimension

  • Pour les valeurs des dimensions numériques, SUM est utilisé.

  • Les dimensions de date sont agrégées par année.

  • Pour les dimensions d’autres types, COUNT est utilisé.

Fait numérique

Mesure

SUM

Fait non numérique

Dimension

  • Les dimensions de date sont agrégées par année.

  • Pour les dimensions d’autres types, COUNT est utilisé.

Métrique numérique

Mesure

Le fichier TDS utilise un champ calculé à la place de la métrique. Le champ calculé transmet la valeur de la métrique à la fonction Snowflake AGG.

Métrique non numérique

Dimension

  • Les dimensions de date sont agrégées par année.

  • Pour les dimensions d’autres types, COUNT est utilisé.

Métrique dérivée numérique

Mesure

Le fichier TDS utilise un champ calculé à la place de la métrique. Le champ calculé transmet la valeur de la métrique à la fonction Snowflake AGG.

Métrique dérivée non numérique

Dimension

  • Les dimensions de date sont agrégées par année.

  • Pour les dimensions d’autres types, COUNT est utilisé.

Les types de données Snowflake suivants sont mappés aux types de données Tableau TDS :

Type de données Snowflake

Type de données Tableau équivalent

NUMBER/FIXED (si l’échelle est supérieure à 0)

real

NUMBER/FIXED (si l’échelle est de 0 ou nulle)

entier

FLOAT ou DECFLOAT

real

STRING ou BINARY

string

BOOLEAN

booléen

TIME

time

DATE

date

DATETIME ou TIMESTAMP

datetime

GEOGRAPHY

spatial

Semi-structuré (VARIANT, OBJECT, ARRAY), structuré (ARRAY, OBJECT, MAP), non structuré (FILE), GEOMETRY, UUID, VECTOR

string

Le fichier TDS présente les capacités suivantes personnalisées pour la connexion à Snowflake :

Nom de la personnalisation

Valeur

Effet de la personnalisation

CAP_ODBC_METADATA_SUPPRESS_EXECUTED_QUERY

yes

Empêche Tableau d’exécuter effectivement une requête comme:samp:SELECT * FROM {table} WHERE 1=0 pour voir les noms des colonnes.

CAP_ODBC_METADATA_SUPPRESS_PREPARED_QUERY

yes

Empêche Tableau de « préparer » une instruction (c’est-à-dire de l’envoyer à Snowflake pour qu’elle soit analysée sans être exécutée) pour identifier les types.

CAP_ODBC_METADATA_SUPPRESS_SELECT_STAR

yes

Empêche Tableau d’utiliser une requête SELECT * pour lire les métadonnées.

CAP_ODBC_METADATA_SUPPRESS_SQLCOLUMNS_API

no

Force Tableau à activer et à utiliser la fonction standard ODBC:code:SQLColumns pour renvoyer des informations de colonnes sur la vue sémantique. Ces informations de colonnes comprennent les noms, les types de données et la précision des colonnes.

CAP_DISABLE_ESCAPE_UNDERSCORE_IN_CATALOG

yes

Empêche Tableau d’échapper les traits de soulignement lors de la recherche du nom de la base de données.

Limites de l’utilisation d’une vue sémantique dans Tableau Desktop

Les limites suivantes s’appliquent aux vues sémantiques dans Tableau Desktop :

  • Vous ne pouvez pas créer un extrait à partir d’une vue sémantique.

    Si vous modifiez votre connexion depuis Live dans:extui:Extract, Tableau Desktop échoue avec l’erreur suivante :

    SQL compilation error:
    Requested semantic expression 'XXX' in FACTS clause must be one of the following types: (DIMENSION, FACT).
    Unable to create extract
    
  • Vous ne pouvez pas utiliser le champ Measure Values dans une vue sémantique.

    Si vous sélectionnez le champ Measure Values dans une vue sémantique, Tableau Desktop signale l’erreur suivante :

    Unable to complete action
    
    Error Code: B9F09DDB
    SQL compilation error: error line 1 at position 7
    Invalid metric expression 'SUM(1)'.
    
  • Vous ne pouvez pas sélectionner le champ Count dans une vue sémantique.

    Si vous sélectionnez SemanticViewName(Count), Tableau Desktop signale l’erreur suivante :

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

    Tableau Desktop ne peut pas signaler le nombre de lignes dans la vue sémantique, car le nombre de lignes peut varier, en fonction des dimensions, des faits et des métriques spécifiés dans la requête.

  • Vous ne pouvez pas faire glisser une mesure seule.

    Si vous faites glisser une mesure, Tableau Desktop signale l’erreur suivante :

    Unable to complete action
    
    Error Code: B9F09DDB
    SQL compilation error: error line 3 at position 8
    Invalid metric expression 'COUNT(1)'.
    
  • Vous ne pouvez pas utiliser directement une métrique non numérique.

    SYSTEM$EXPORT_TDS_FROM_SEMANTIC_VIEW convertit les métriques non numériques en dimensions dans Tableau. Si vous tentez d’utiliser l’une de ces dimensions, Tableau Desktop signale l’erreur suivante :

    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).
    

    Pour contourner ce problème, convertissez la dimension en mesure :

    1. Effectuez un clic droit sur la dimension et sélectionnez Convert to Measure.

      Ceci convertit la dimension en mesure, en utilisant l’agrégation Count (Distinct) par défaut.

    2. Pour utiliser une agrégation différente, effectuez un clic droit sur la mesure convertie, sélectionnez Default Properties » Aggregations, puis sélectionnez l’agrégation que vous souhaitez utiliser.

Renommer une vue sémantique

Pour renommer une vue sémantique, exécutez ALTER SEMANTIC VIEW … RENAME TO …. Par exemple :

ALTER SEMANTIC VIEW sv RENAME TO sv_new_name;

Supprimer une vue sémantique

Pour supprimer une vue sémantique, exécutez la commande DROP SEMANTIC VIEW. Par exemple :

DROP SEMANTIC VIEW tpch_rev_analysis;

Octroyer des privilèges sur des vues sémantiques

Privilèges de la vue sémantique liste les privilèges que vous pouvez accorder à une vue sémantique.

Pour travailler avec une vue sémantique, vous devez obligatoirement disposer des privilèges suivants sur cette vue :

  • Tout privilège (par exemple, MONITOR, REFERENCES ou SELECT) sur une vue est nécessaire pour exécuter la commande DESCRIBE SEMANTIC VIEW sur cette vue.

  • Tout privilège sur une vue est nécessaire pour afficher cette vue dans la sortie de la commande SHOW SEMANTIC VIEWS.

  • SELECT est nécessaire pour interroger la vue sémantique.

Note

Pour interroger une vue sémantique, vous n’avez pas besoin du privilège SELECT sur les tables utilisées dans la vue sémantique. Vous n’avez besoin que du privilège SELECT sur la vue sémantique elle-même.

Ce comportement est cohérent avec les privilèges requis pour interroger les vues standard.

Pour utiliser une vue sémantique dont vous n’êtes pas propriétaire dans Cortex Analyst, vous devez utiliser un rôle qui possède les privilèges REFERENCES et SELECT sur cette vue.

Pour accorder les privilèges REFERENCES et SELECT sur une vue sémantique, utilisez la commande GRANT <privilèges> … TO ROLE. Par exemple, pour accorder au rôle my_analyst_role des privilèges REFERENCES et SELECT sur la vue sémantique nommée my_semantic_view, vous pouvez exécuter l’instruction suivante :

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

Si vous disposez d’un schéma contenant des vues sémantiques que vous souhaitez partager avec les utilisateurs de Cortex Analyst, vous pouvez utiliser des autorisations futures pour accorder les privilèges sur toute vue sémantique que vous créez dans ce schéma. Par exemple :

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