Utilização dos comandos SQL para criar e gerenciar exibições semânticas

Este tópico explica como usar os seguintes comandos SQL para criar e gerenciar exibições semânticas:

Este tópico também explica como chamar o procedimento armazenado e a função a seguir para criar uma exibição semântica de uma especificação YAML e obter a especificação para uma exibição semântica:

Privilégios necessários para criar ou substituir uma exibição semântica

Para criar ou substituir uma exibição semântica, você deve usar uma função com os seguintes privilégios:

  • CREATE SEMANTIC VIEW no esquema em que você está criando a exibição semântica.

  • USAGE no banco de dados e no esquema em que você está criando a exibição semântica.

  • SELECT nas tabelas e exibições usadas na exibição semântica.

Para obter informações sobre os privilégios necessários para consultar uma exibição semântica, confira Privilégios necessários para consultar uma exibição semântica.

Criando uma exibição semântica com o comando CREATE SEMANTIC VIEW

Para criar uma exibição semântica, use o comando CREATE SEMANTIC VIEW.

Nota

Para criar uma exibição semântica de uma especificação YAML, chame o procedimento armazenado SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML.

A exibição semântica deve ser válida. Consulte Como o Snowflake valida as exibições semânticas.

O exemplo a seguir usa os dados de amostra TPC-H disponíveis no Snowflake. Esse conjunto de dados contém tabelas que representam um cenário de negócios simplificado com clientes, pedidos e itens de linha.

Modelo de dados das tabelas usadas nos dados de amostra TPC-H

O exemplo cria uma exibição semântica chamada tpch_rev_analysis, usando as tabelas do conjunto de dados TPC-H. A exibição semântica define:

  • Três tabelas lógicas (orders, customers e line_items).

  • Uma relação entre as tabelas orders e customers.

  • Uma relação entre as tabelas line_items e orders.

  • Fatos que serão usados para calcular as métricas.

  • Dimensões para o nome do cliente, a data do pedido e o ano em que o pedido foi feito.

  • Métricas para o valor médio de um pedido e o número médio de itens de linha em um pedido.

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

As próximas seções explicam esse exemplo em mais detalhes:

Nota

Para obter um exemplo completo, consulte Exemplo de uso do SQL para criar uma exibição semântica.

Definição das tabelas lógicas

No comando CREATE SEMANTIC VIEW, use a cláusula TABLES para definir as tabelas lógicas na visualização. Nessa cláusula, você pode:

  • Especificar o nome da tabela física e um alias opcional.

  • Identificar as seguintes colunas na tabela lógica:

    • Colunas que servem como chaves primárias.

    • Colunas que contêm valores exclusivos (que não sejam colunas de chave primária).

    Você pode usar essas colunas para definir relações nessa exibição semântica.

  • Adicionar sinônimos para a tabela (para melhorar a capacidade de descoberta).

  • Incluir um comentário descritivo.

No exemplo apresentado anteriormente, a cláusula TABLES define três tabelas lógicas:

  • Uma tabela orders contendo as informações do pedido da tabela TPC-H orders.

  • Uma tabela customers contendo as informações do cliente da tabela TPC-H customers.

  • Uma tabela line_items contendo os itens de linha em pedidos da tabela TPC-H lineitem.

O exemplo usa a cláusula PRIMARY KEY para identificar as colunas a serem usadas como chaves primárias para cada tabela lógica. As chaves primárias e os valores únicos ajudam a determinar os tipos de relacionamentos entre as tabelas (por exemplo, muitos para um ou um para um).

O exemplo também fornece sinônimos e comentários que descrevem as tabelas lógicas e facilitam a descoberta dos dados.

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

Identificar as relações entre as tabelas lógicas

No comando CREATE SEMANTIC VIEW, use a cláusula RELATIONSHIPS para identificar os relacionamentos entre as tabelas na visualização. Para cada relação, você especifica:

  • Um nome opcional para a relação.

  • O nome da tabela lógica que contém a chave estrangeira.

  • As colunas dessa tabela que definem a chave estrangeira.

  • O nome da tabela lógica que contém a chave primária ou as colunas com valores exclusivos.

  • As colunas dessa tabela que definem a chave primária ou que contêm valores exclusivos.

    • Se você já tiver especificado PRIMARY KEY para a tabela lógica na cláusula TABLES, não precisará especificar a coluna de chave primária na relação.

    • Se houver uma única palavra-chave UNIQUE para a tabela lógica na cláusula TABLES, você não precisará especificar as colunas correspondentes na relação.

    Também é possível especificar uma data, hora, carimbo de data/hora ou coluna numérica, se quiser unir as colunas em um intervalo.

No exemplo apresentado anteriormente, a cláusula RELATIONSHIPS especifica duas relações:

  • Uma relação entre as tabelas orders e customers. Na tabela orders, o_custkey é a chave estrangeira que se refere à chave primária na tabela customers (c_custkey).

  • Uma relação entre as tabelas line_items e orders. Na tabela line_items, l_orderkey é a chave estrangeira que se refere à chave primária na tabela 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)
)

Como usar uma data, hora, carimbo de data/hora ou intervalo numérico para unir tabelas lógicas

Por padrão, quando você especifica uma relação entre duas tabelas lógicas, as tabelas são unidas em uma condição de igualdade.

Se você precisar unir duas tabelas lógicas em um intervalo de data, hora, carimbo de data/hora ou numérico (onde os valores em uma coluna de uma tabela precisam estar no mesmo intervalo que os valores em uma coluna de outra tabela), você pode especificar a palavra-chave ASOF com o nome da coluna na cláusula REFERENCES:

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

Uma consulta da exibição semântica definida acima produz um ASOF JOIN que utiliza o perador de comparação >= na cláusula MATCH_CONDITION. Isto une as duas tabelas para que os valores em col_table_1 fiquem maiores ou iguais aos valores em 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
  )
...

Nota

Nenhum outro operador de comparação na cláusula MATCH_CONDITION é compatível.

Você pode usar a palavra-chave ASOF para colunas dos mesmos tipos que você pode usar com ASOF JOIN.

Nota

Você pode especificar no máximo uma palavra-chave ASOF na definição de um determinado relacionamento. É possível especificar esta palavra-chave antes de qualquer coluna da lista.

Por exemplo, suponha que você tenha tabelas contendo dados de cliente, endereço do cliente e pedido:

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

Neste exemplo, a tabela customer_address tem uma coluna ca_start_date, que indica quando o cliente começou a residir no endereço especificado. A tabela orders tem uma coluna o_ord_date, que é a data do pedido.

Suponha que você queira poder consultar informações sobre os pedidos dos clientes e recuperar os códigos postais correspondentes ao local onde o cliente residia quando os pedidos foram feitos.

É possível definir uma exibição semântica que especifique uma junção ASOF entre as colunas ca_start_date e 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)
  );

Suponha que você consulte essa exibição semântica para retornar a soma dos valores dos pedidos por mês para cada código 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 |
+----------------+----------------+----------------+

A consulta efetivamente usa ASOF JOIN para unir as tabelas nas colunas de datas, em que a data do pedido é maior ou igual à data de início do endereço:

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

Unindo tabelas lógicas que contêm intervalos de valores

Você pode usar uma junção de intervalo quando quiser unir uma tabela a outra tabela que define um intervalo de valores possíveis na primeira tabela. Por exemplo, suponha que uma tabela represente pedidos de vendas e tenha uma coluna com o carimbo de data/hora em que o pedido foi feito. Suponha que outra tabela represente trimestres fiscais e contenha os intervalos de tempo distintos que representam esses trimestres. Você pode criar uma exibição semântica para unir as duas tabelas de modo que a linha de um pedido inclua o trimestre fiscal em que o pedido foi feito.

Na tabela que contém os intervalos, cada intervalo deve ser distinto. Dois intervalos não podem se sobrepor.

Nos dados da tabela, se você quiser especificar o menor valor possível ou o maior valor possível para o intervalo, use NULL.

Por exemplo, a tabela a seguir define um conjunto de intervalos de horas que não se sobrepõem:

  • A primeira linha cobre o intervalo que inclui tudo até (mas sem incluir) 1º de janeiro de 2024.

  • A última linha cobre o intervalo que inclui tudo de 20 de março de 2024 em diante.

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

Nota

Duas linhas não podem conter NULL na coluna inicial e nem conter NULL na coluna final.

Para casos como esses, você pode configurar uma exibição semântica compatível com consultas de junção de intervalo. Ao criar a exibição semântica, você deve fazer o seguinte:

  1. Para a tabela lógica contendo as horas de início e de término de um período, defina uma restrição que especifique que dois intervalos não podem se sobrepor.

    Na cláusula TABLE do comando CREATE SEMANTIC VIEW, especifique a cláusula CONSTRAINT na definição da tabela lógica. Para saber a sintaxe, consulte a documentação de CONSTRAINT no tópico CREATE SEMANTIC VIEW.

  2. Defina um relacionamento entre a coluna que contém o carimbo de data/hora em uma tabela e as colunas de horas de início e de término na outra tabela.

    Na cláusula RELATIONSHIPS do comando CREATE SEMANTIC VIEW, use a cláusula BETWEEN para especificar as colunas que contêm as horas de início e de término. Para saber a sintaxe, consulte a documentação de RELATIONSHIP no tópico CREATE SEMANTIC VIEW.

Por exemplo, suponha que a tabela my_time_periods defina períodos de tempo distintos:

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

Suponha que a tabela my_events capture eventos que ocorreram dentro desses períodos de tempo:

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

Você pode definir uma exibição semântica que una as tabelas. As linhas em my_events são unidas às linhas em my_time_periods, em que o valor na coluna event_timestamp em my_events está dentro do intervalo especificado pelas colunas start_time e end_time em 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(*)
  );

A consulta a seguir demonstra como as linhas são unidas:

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

Como mostrado nos exemplos, a dimensão dim_time_period_name para cada linha nos resultados é o nome do período no qual a dimensão dim_event_timestamp se enquadra.

Definição de fatos, dimensões e métricas

No comando CREATE SEMANTIC VIEW, use as cláusulas FACTS, DIMENSIONS e METRICS para definir os fatos, as dimensões e as métricas na exibição semântica.

Você deve definir pelo menos uma dimensão ou métrica na exibição semântica.

Para cada fato, dimensão ou métrica, você deve especificar:

Nota

Se uma métrica não deve ser agregada em dimensões específicas, você deve especificar que essas dimensões devem ser não aditivas.

Para obter mais informações, consulte Identificando as dimensões que devem ser não aditivas para uma métrica.

O exemplo apresentado anteriormente define vários fatos, dimensões e métricas:

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

Nota

Para ver mais diretrizes sobre a definição de métricas que usam funções de janela, consulte Definição e consulta de métricas de função de janela.

Definição de uma dimensão que usa um Cortex Search Service

Para definir uma dimensão que usa um Cortex Search Service, defina a cláusula WITH CORTEX SEARCH SERVICE com o nome do Cortex Search Service. Se o serviço estiver em um banco de dados ou esquema diferente, qualifique o nome do serviço. Por exemplo:

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

Definição de métricas derivadas

Ao definir uma métrica, você especifica o nome da tabela lógica à qual a métrica pertence. Essa é a tabela lógica na qual a métrica é agregada.

Se quiser definir uma métrica baseada em métricas de diferentes tabelas lógicas, você poderá definir uma métrica derivada. Uma métrica derivada é uma métrica com escopo definido para a exibição semântica (em vez de para uma tabela lógica específica). Uma métrica derivada pode combinar métricas de vários tabelas lógicas.

Na definição de uma métrica derivada, omita o nome da tabela lógica.

Por exemplo, suponha que você queira definir uma métrica my_derived_metric_1 que é a soma das métricas table_1.metric_1 e table_2.metric_2. Quando você definir my_derived_metric_1, não qualifique o nome com nenhum nome de tabela lógica:

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

Você pode usar outras métricas derivadas na expressão. Por exemplo:

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
)

Observe as seguintes restrições ao definir uma métrica derivada:

  • Você não pode usar o mesmo nome para uma métrica derivada e uma métrica regular.

  • A expressão para uma métrica derivada pode usar:

    • Agregações de dimensões e fatos definidos em qualquer tabela lógica na exibição semântica.

    • Expressões escalares de métricas definidas em qualquer tabela lógica na exibição semântica.

    • Outras métricas derivadas.

    No seguinte exemplo:

    • derived_metric_1 usa uma expressão escalar com duas métricas.

    • derived_metric_2 usa uma agregação de uma dimensão.

    • derived_metric_3 adiciona uma agregação de uma dimensão a outra métrica derivada.

    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
      )
      ...
    
  • Você não precisará qualificar o nome de uma métrica na dimensão nem o fato na expressão se o nome não for ambíguo. Por exemplo:

    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
    )
    

    Observe que metric_1 precisa ser qualificado por table_1 porque há duas métricas chamadas metric_1, mas my_unique_metric_name não precisa ser qualificado porque o nome é exclusivo.

  • Na expressão para uma métrica derivada, você não pode usar o seguinte:

    • Agregações de métricas.

    • Funções de janela.

    • Referências a colunas físicas.

    • Referências a fatos ou dimensões que não são agregados.

  • Você não pode usar uma métrica derivada na expressão para uma métrica, dimensão ou fato regular. Somente outra métrica derivada pode usar uma métrica derivada em sua expressão.

Especificando o relacionamento de uma métrica quando há vários caminhos de relacionamento

Em alguns casos, vários caminhos de relacionamento podem existir entre duas tabelas lógicas específicas em uma exibição semântica. Nesses casos, ao definir uma métrica, você deve especificar o caminho de relacionamento a ser usado.

Problema com vários caminhos de relacionamento

Suponha que você tenha duas tabelas com informações sobre voos e aeroportos:

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

Suponha que você defina uma exibição semântica que forneça informações sobre o número total de voos que saem e chegam a uma cidade específica:

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

A exibição semântica especifica dois relacionamentos diferentes entre a tabela flights e a tabela airports (flight_departure_airport e flight_arrival_airport). Como há vários caminhos de relacionamento entre as tabelas, há uma falha na consulta para a métrica m_flight_count e a seleção da dimensão airports.city_name (ou qualquer dimensão na tabela airports):

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.

Como há vários caminhos entre as tabelas flights e airports, há uma falha na consulta. Se a consulta não selecionou uma dimensão da tabela airports, ela é bem-sucedida.

Especificando o relacionamento que será usado

Na definição da métrica no comando CREATE SEMANTIC VIEW, é possível especificar qual relacionamento usar na cláusula USING:

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

Nota

  • Cada relacionamento especificado deve começar da tabela lógica que contém a métrica. Por exemplo, suponha que você queira especificar:

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

    O relacionamento table_a_to_table_b deve começar de table_a:

    RELATIONSHIPS (
      table_a_to_table_b AS table_a(col_1) REFERENCES table_b(col_1)
      ...
    
  • Não é possível especificar uma sequência de relacionamentos (por exemplo, table_a_to_table_b e table_b_to_table_c). Cada relacionamento deve começar da tabela lógica que contém a métrica.

  • Se você precisa identificar os relacionamentos da tabela lógica que contém a métrica com outras tabelas, é possível especificar os relacionamentos na cláusula USING. Por exemplo, suponha que você queira que a métrica seja computada por relacionamentos específicos de table_a com table_b e de table_a com table_c. Nesse caso, você especifica ambos os relacionamentos na cláusula USING:

    METRICS (
      table_a.metric_a
        USING ( table_a_to_table_b, table_a_to_table_c )
        ...
    
  • Não é possível especificar a cláusula USING em uma métrica derivada.

Por exemplo, a instrução a seguir define duas métricas adicionais que usam relacionamentos específicos:

  • m_flight_departure_count, que usa o relacionamento flight_departure_airport.

  • m_flight_arrival_count, que usa o relacionamento 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
  );

Ao consultar essa exibição, você pode especificar as duas novas métricas que utilizam os relacionamentos específicos:

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

Adicionar dimensões que dependem dos mesmos relacionamentos

A consulta no exemplo anterior usou a dimensão airports.city_name, que está na tabela lógica airports em que os relacionamentos são baseados.

Se você adicionar uma dimensão para outra tabela lógica à exibição, as consultas dessa dimensão se beneficiarão dos relacionamentos que você já especificou.

Por exemplo, suponha que você crie uma tabela chamada regions com informações adicionais sobre as regiões de aeroportos especificadas na coluna airport_region_code da tabela 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          |
+-------------+---------------+

Você pode estender a exibição semântica que já definiu para retornar o nome da região:

  • Adicione uma nova tabela lógica para a tabela regions.

  • Adicione um relacionamento entre as tabelas regions e airports.

  • Adicione uma dimensão para o nome da região.

Você não precisa fazer mais alterações na cláusula USING para as métricas porque há um único relacionamento entre as tabelas regions e 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
  );

Se você consultar a exibição, especificando a dimensão region_name, e houver uma ambiguidade sobre qual relacionamento usar, a cláusula USING determinará os relacionamentos que serão usados:

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

Especificar relacionamentos com tabelas diferentes

Se a exibição semântica usa dimensões de várias tabelas, e você precisa especificar os relacionamentos que serão usados para as dimensões, pode especificar vários relacionamentos na cláusula USING.

Por exemplo, suponha que você crie uma tabela chamada weather com informações meteorológicas para os aeroportos na tabela 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 |
+--------------+-------------------+-------------------------+-------------------------+

Você pode estender a exibição semântica que já definiu para retornar as condições climáticas:

  • Adicione uma nova tabela lógica para a tabela weather.

  • Adicione dois relacionamentos entre as tabelas weather e flights (um para partidas e outro para chegadas de voos).

  • Adicione uma dimensão para as informações meteorológicas.

  • Especifique que as métricas também devem usar os dois novos relacionamentos entre as tabelas weather e 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
  );

Quando você consulta a exibição e especifica a dimensão weather_condition, a cláusula USING determina os relacionamentos que são usados:

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

Definir métricas derivadas com base em métricas que usam relacionamentos específicos

Não é possível especificar a cláusula USING em uma métrica derivada, mas você pode definir uma métrica derivada que usa métricas que especificam a cláusula USING.

Por exemplo, a seguinte exibição semântica define duas métricas derivadas:

  • global_m_departure_arrival_ratio

  • global_m_departure_arrival_sum

As definições dessas métricas derivadas usam as métricas flights.m_flight_departure_count e flights.m_flight_arrival_count, que especificam a cláusula 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     |
+------------------------+--------------------------+----------------------------------+--------------+

Identificando as dimensões que devem ser não aditivas para uma métrica

Em alguns casos, uma métrica não deve ser agregada em dimensões específicas. Nesses casos, você pode marcar as dimensões como não aditivas.

Explicando o problema com a agregação de métricas em algumas dimensões

Suponha que você tenha uma tabela com os saldos das contas corrente e poupança de cada cliente em um dia específico.

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

Suponha que você queira definir uma exibição semântica que inclua:

  • As seguintes dimensões:

    • ID de cliente

    • Tipo de conta

    • Ano

    • Month

    • Dia

  • Uma métrica para a soma do saldo.

A seguinte instrução cria uma exibição semântica que inclui as dimensões e métricas listadas acima:

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

Se quiser recuperar o saldo total das contas corrente e poupança de cada cliente no fim de cada ano, você pode consultar a exibição semântica para a métrica m_account_balance e especificar as dimensões customer_id_dim e year_dim.

No entanto, a métrica m_account_balance será a soma dos saldos de cada dia para cada cliente, porque a métrica é agregada pelas dimensões de data.

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

No exemplo acima, para cust-001 em 2024, 910 é a soma dos saldos de cada dia (100 + 110 + 140 + 150 + 200 + 210).

Impedindo que uma métrica seja agregada em dimensões específicas

Para impedir que a métrica seja agregada pelas dimensões de data, especifique as dimensões de data na cláusula NON ADDITIVE BY ao criar a exibição semântica:

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

Nota

  • Se você especificar a cláusula NON ADDITIVE BY em uma métrica, não poderá se referir a essa métrica nas definições de métricas que não são derivadas. Somente métricas derivadas podem se referir a métricas que especificam dimensões não aditivas.

A especificação da cláusula NON ADDITIVE BY torna a métrica semiaditiva.

Ao consultar essa exibição semântica, a métrica m_account_balance não é mais agregada pelas dimensões de data. A consulta agrega os saldos das contas no fim do período em cada grupo de dimensões consultadas.

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

No exemplo acima, para cust-001 em 2024, 210 é a soma dos saldos das contas corrente e poupança referente ao último dia do ano que contém dados:

  • O último dia de 2024 que contém dados é 2024-03-30.

  • Não há linha com essa data para a conta corrente, portanto a métrica resultante é o saldo da conta poupança (210).

Como outro exemplo, se você quiser apenas o saldo total da conta de todos os clientes no fim do ano, poderá especificar a dimensão year_dim.

Como as dimensões de data são marcadas como não aditivas, a consulta soma os valores no final do período (por data) referentes aos saldos das contas corrente e poupança de cada cliente.

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

Durante o processamento da consulta, as linhas são classificadas pelas dimensões não aditivas, e os valores das últimas linhas (os últimos instantâneos de valores) são agregados para computar a métrica.

Nota

Como as linhas são classificadas pelas dimensões não aditivas, a ordem na qual você especifica as dimensões é importante. Isso é semelhante à ordem na qual você especifica as colunas na cláusula ORDER BY.

Especificando a ordem de classificação para dimensões não aditivas

Conforme demonstrado no exemplo, a métrica agrega os valores dos saldos das contas corrente e poupança de cada cliente no fim de um período. Se você quiser mudar a ordem de classificação, poderá especificar a palavra-chave ASC ou DESC ao lado do nome da dimensão. Por exemplo:

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

Neste exemplo, a métrica é avaliada para a data mais antiga especificada por year_dim, month_dim e day_dim.

Se a dimensão incluir valores NULL, você poderá usar as palavras-chave NULLS FIRST ou NULLS LAST para especificar se os valores NULL são classificados primeiro ou por último nos resultados:

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)

Marcação de fato ou métrica como privado

Se você estiver definindo um fato ou métrica apenas para uso em cálculos na exibição semântica e não quiser que o fato ou métrica seja retornado em uma consulta, poderá especificar a palavra-chave PRIVATE para marcar o fato ou métrica como privado. Por exemplo:

FACTS (
  PRIVATE my_private_fact AS ...
)

METRICS (
  PRIVATE my_private_metric AS ...
)

Nota

Você não pode marcar uma dimensão como privada. As dimensões são sempre públicas.

Ao consultar uma exibição semântica com fatos ou métricas privados, você não pode especificar um fato ou uma métrica privada nas seguintes cláusulas:

Alguns comandos e funções incluem fatos e métricas privados:

Alguns comandos e funções incluem fatos e métricas privados somente em condições específicas:

Outros comandos e funções não incluem fatos e métricas privados:

Fornecendo instruções personalizadas para o Cortex Analyst

Em uma exibição semântica, você pode fornecer instruções para o Cortex Analyst que explicam como:

  • Gerar a instrução SQL

  • Classificar perguntas e enviar prompt de informações adicionais

Para fornecer as instruções personalizadas, use as seguintes cláusulas:

  • Para obter instruções sobre como gerar a instrução SQL, use a cláusula AI_SQL_GENERATION no comando CREATE SEMANTIC VIEW.

    Por exemplo, para solicitar que o Cortex Analyst gere a instrução SQL para que todas as colunas numéricas sejam arredondadas para duas casas decimais, especifique o seguinte:

    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
    
  • Para obter instruções sobre como classificar perguntas, use a cláusula AI_QUESTION_CATEGORIZATION.

    Por exemplo, para solicitar que o Cortex Analyst rejeite perguntas sobre usuários, especifique o seguinte:

    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
    

    Você também pode fornecer instruções para solicitar mais detalhes, se a pergunta não for clara. Por exemplo:

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

Criação de exibição semântica de uma especificação YAML

Para criar uma exibição semântica de uma especificação YAML, você pode chamar o procedimento armazenado SYSTEM$CREATE_SEMANTIC_VIEW_FROM_YAML.

Primeiro, passe TRUE como terceiro argumento para verificar se você pode criar a exibição semântica da especificação YAML.

O seguinte exemplo verifica se você pode usar uma determinada especificação de modelo semântico em YAML para criar uma exibição semântica chamada tpch_analysis no banco de dados my_db e no esquema 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);

Se a especificação for válida, o procedimento armazenado retornará a seguinte mensagem:

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

Se a sintaxe YAML é inválida, o procedimento armazenado gera uma exceção. Por exemplo, se faltar dois pontos:

relationships
  - name: LINE_ITEM_TO_ORDERS

o procedimento armazenado gera uma exceção, indicando que a sintaxe YAML é inválida:

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
                ^

Se a especificação se referir a uma tabela física que não existe, o procedimento armazenado vai gerar uma exceção:

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.

Da mesma forma, se a especificação se referir a uma coluna de chave primária que não existe, o procedimento armazenado vai gerar uma exceção:

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'

Em seguida, você pode chamar o procedimento armazenado sem passar o terceiro argumento para criar a exibição semântica.

O seguinte exemplo cria uma exibição semântica chamada tpch_analysis no banco de dados my_db e no esquema 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. |
+-----------------------------------------+

Modificação do comentário para uma exibição semântica existente

Para modificar o comentário de uma exibição semântica existente, execute o comando ALTER SEMANTIC VIEW. Por exemplo:

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

Nota

Não é possível usar o comando ALTER SEMANTIC VIEW para alterar propriedades diferentes do que o comentário. Para alterar outras propriedades da exibição semântica, substitua a exibição semântica. Consulte Substituição de uma exibição semântica existente.

Você também pode usar o comando COMMENT para definir um comentário para uma exibição semântica:

COMMENT ON SEMANTIC VIEW my_semantic_view IS 'my comment';

Substituição de uma exibição semântica existente

Para substituir uma exibição semântica existente (por exemplo, para alterar a definição da exibição), especifique OR REPLACE ao executar CREATE SEMANTIC VIEW. Se você quiser preservar os privilégios concedidos na exibição semântica existente, especifique COPY GRANTS. Por exemplo:

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;

Listagem de exibições semânticas

Para listar exibições semânticas no esquema atual ou em um esquema especificado, execute o comando SHOW SEMANTIC VIEWS. Por exemplo:

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

A saída do comando SHOW OBJECTS inclui exibições semânticas. Na coluna kind, o tipo de objeto é listado como VIEW. Por exemplo:

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

Você também pode consultar as exibições de exibições semânticas nos esquemas ACCOUNT_USAGE e INFORMATION_SCHEMA.

Listagem de dimensões, fatos e métricas

Para listar as dimensões, os fatos e as métricas disponíveis em uma exibição, um esquema, um banco de dados ou uma conta, você pode executar os seguintes comandos:

Por padrão, os comandos listam as dimensões, os fatos e as métricas disponíveis nas exibições semânticas definidas no esquema atual:

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

Os exemplos a seguir demonstram como listar as dimensões, os fatos e as métricas para exibições semânticas em diferentes escopos:

  • Listar as dimensões, os fatos e as métricas em exibições semânticas no banco de dados atual:

    SHOW SEMANTIC DIMENSIONS IN DATABASE;
    
    SHOW SEMANTIC FACTS IN DATABASE;
    
    SHOW SEMANTIC METRICS IN DATABASE;
    
  • Listar as dimensões, os fatos e as métricas em exibições semânticas em um esquema ou banco de dados específico:

    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;
    
  • Listar as dimensões, os fatos e as métricas em exibições semânticas na conta:

    SHOW SEMANTIC DIMENSIONS IN ACCOUNT;
    
    SHOW SEMANTIC FACTS IN ACCOUNT;
    
    SHOW SEMANTIC METRICS IN ACCOUNT;
    
  • Listar as dimensões, os fatos e as métricas em uma exibição semântica específica:

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

Se você estiver consultando uma exibição semântica, poderá usar o comando SHOW SEMANTIC DIMENSIONS FOR METRIC para determinar quais dimensões você pode retornar ao especificar uma determinada métrica. Para obter mais detalhes, consulte Escolha das dimensões que você pode retornar para uma determinada métrica.

Quando você executa o comando SHOW COLUMNS para uma exibição semântica, a saída inclui as dimensões, os fatos e as métricas na exibição semântica. A coluna kind indica se a linha representa uma dimensão, um fato ou uma métrica.

Por exemplo:

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

Exibição dos detalhes sobre uma exibição semântica

Para visualizar os detalhes de uma exibição semântica, execute o comando DESCRIBE SEMANTIC VIEW. Por exemplo:

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

Obtenção da instrução SQL para uma exibição semântica

Você pode chamar a função GET_DDL para recuperar a instrução DDL que criou uma exibição semântica.

Nota

Para chamar essa função para uma exibição semântica, você deve usar uma função que tenha recebido o privilégio REFERENCES ou OWNERSHIP na exibição semântica.

Ao chamar GET_DDL, passe 'SEMANTIC_VIEW' como o tipo de objeto. Por exemplo:

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

O valor de retorno inclui fatos e métricas privados (fatos e métricas marcados com a palavra-chave PRIVATE).

Como obter a especificação YAML para uma exibição semântica

Para obter a especificação YAML para uma exibição semântica, chame a função SYSTEM$READ_YAML_FROM_SEMANTIC_VIEW.

O seguinte exemplo retorna a especificação YAML para a exibição semântica chamada tpch_analysis no banco de dados my_db e no esquema 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                             |
|                                                             |
+-------------------------------------------------------------+

Exportando uma exibição semântica para um arquivo de fonte de dados do Tableau (TDS)

Para exportar uma exibição semântica para um arquivo de fonte de dados do Tableau (Tableau Data Source, TDS), chame a função SYSTEM$EXPORT_TDS_FROM_SEMANTIC_VIEW.

O exemplo a seguir retorna o conteúdo do arquivo TDS para a exibição semântica 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>                                                                                                                                                                                                                                   |
| ...                                                                                                                                 |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Copie o XML para um arquivo .tds e abra o arquivo no Tableau Desktop.

O Tableau Desktop exibe uma pasta para cada tabela lógica na lista de pastas à esquerda. Os nomes das pastas usam espaços em vez de sublinhados, e cada palavra começa com uma letra maiúscula. Por exemplo, o nome da pasta para a tabela lógica date_dim é Date Dim.

Cada pasta contém dimensões e medidas do Tableau que correspondem às dimensões, aos fatos e às métricas na exibição semântica.

As seções a seguir apresentam mais detalhes e as limitações do processo de conversão:

Sobre a conversão

A função converte dimensões, fatos e métricas na exibição semântica nos seguintes equivalentes no arquivo TDS do Tableau:

Elemento na exibição semântica

Equivalente do Tableau (dimensão ou medida)

Como os dados são agregados

Dimensão

Dimensão

  • Para valores de dimensões numéricas, SUM é usado.

  • As dimensões de data são agregadas por ano.

  • Para dimensões de outros tipos, COUNT é usado.

Fato numérico

Medida

SUM

Fato não numérico

Dimensão

  • As dimensões de data são agregadas por ano.

  • Para dimensões de outros tipos, COUNT é usado.

Métrica numérica

Medida

O arquivo TDS usa um campo calculado no lugar da métrica. O campo calculado passa o valor da métrica para a função AGG do Snowflake.

Métrica não numérica

Dimensão

  • As dimensões de data são agregadas por ano.

  • Para dimensões de outros tipos, COUNT é usado.

Métrica derivada numérica

Medida

O arquivo TDS usa um campo calculado no lugar da métrica. O campo calculado passa o valor da métrica para a função AGG do Snowflake.

Métrica derivada não numérica

Dimensão

  • As dimensões de data são agregadas por ano.

  • Para dimensões de outros tipos, COUNT é usado.

Os seguintes tipos de dados do Snowflake são mapeados para os tipos de dados TDS correspondentes do Tableau:

Tipo de dados do Snowflake

Tipo de dados equivalente do Tableau

NUMBER/FIXED (se a escala for maior que 0)

real

NUMBER/FIXED (se a escala for 0 ou nula)

inteiro

FLOAT ou DECFLOAT

real

STRING ou BINARY

string

BOOLEAN

booleano

TIME

hora

DATE

data

DATETIME ou TIMESTAMP

datetime

GEOGRAPHY

spatial

Semiestruturado (VARIANT, OBJECT, ARRAY), estruturado (ARRAY, OBJECT, MAP), não estruturado (FILE), GEOMETRY, UUID, VECTOR

string

O arquivo TDS tem os seguintes recursos personalizados para conexão com o Snowflake:

Nome da personalização

Valor

Efeito da personalização

CAP_ODBC_METADATA_SUPPRESS_EXECUTED_QUERY

yes

Impede o Tableau de executar uma consulta como SELECT * FROM table WHERE 1=0 para ver os nomes das colunas.

CAP_ODBC_METADATA_SUPPRESS_PREPARED_QUERY

yes

Impede o Tableau de «preparar» uma instrução (enviando-a ao Snowflake para análise sem executá-la) para aprender sobre tipos.

CAP_ODBC_METADATA_SUPPRESS_SELECT_STAR

yes

Impede o Tableau de usar uma consulta SELECT * para ler metadados.

CAP_ODBC_METADATA_SUPPRESS_SQLCOLUMNS_API

no

Força o Tableau a habilitar e usar a função ODBC SQLColumns padrão para retornar informações de coluna sobre a exibição semântica. Essas informações incluem os nomes, os tipos de dados e a precisão das colunas.

CAP_DISABLE_ESCAPE_UNDERSCORE_IN_CATALOG

yes

Impede o Tableau de usar sublinhados de escape ao pesquisar o nome do banco de dados.

Limitações ao usar uma exibição semântica no Tableau Desktop

As seguintes limitações se aplicam às exibições semânticas no Tableau Desktop:

  • Não é possível criar uma extração de uma exibição semântica.

    Se você alterar a conexão de Live para Extract, o Tableau Desktop falhará com o seguinte erro:

    SQL compilation error:
    Requested semantic expression 'XXX' in FACTS clause must be one of the following types: (DIMENSION, FACT).
    Unable to create extract
    
  • Não é possível usar o campo Measure Values em uma exibição semântica.

    Se você selecionar o campo Measure Values em uma exibição semântica, o Tableau Desktop relatará o seguinte erro:

    Unable to complete action
    
    Error Code: B9F09DDB
    SQL compilation error: error line 1 at position 7
    Invalid metric expression 'SUM(1)'.
    
  • Não é possível selecionar o campo Count em uma exibição semântica.

    Se você selecionar SemanticViewName(Count), o Tableau Desktop relatará o seguinte erro:

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

    O Tableau Desktop não pode relatar o número de linhas na exibição semântica porque esse número pode variar, dependendo das dimensões, dos fatos e das métricas especificados na consulta.

  • Não é possível arrastar uma medida sozinha.

    Se você arrastar uma medida, o Tableau Desktop relatará o seguinte erro:

    Unable to complete action
    
    Error Code: B9F09DDB
    SQL compilation error: error line 3 at position 8
    Invalid metric expression 'COUNT(1)'.
    
  • Não é possível usar diretamente uma métrica não numérica.

    SYSTEM$EXPORT_TDS_FROM_SEMANTIC_VIEW converte métricas não numéricas em dimensões no Tableau. Se você tentar usar uma dessas dimensões, o Tableau Desktop relatará o seguinte erro:

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

    Para contornar isso, converta a dimensão em uma medida:

    1. Clique com o botão direito do mouse na dimensão e selecione Convert to Measure.

      Isso converte a dimensão em uma medida, usando a agregação padrão Count (Distinct).

    2. Para usar uma agregação diferente, clique com o botão direito do mouse na medida convertida, selecione Default Properties » Aggregations e selecione a agregação que você deseja usar.

Renomeação de uma exibição semântica

Para renomear uma exibição semântica, execute ALTER SEMANTIC VIEW … RENAME TO …. Por exemplo:

ALTER SEMANTIC VIEW sv RENAME TO sv_new_name;

Remoção de uma exibição semântica

Para remover uma exibição semântica, execute o comando DROP SEMANTIC VIEW. Por exemplo:

DROP SEMANTIC VIEW tpch_rev_analysis;

Concessão de privilégios em exibições semânticas

Privilégios de exibição semântica lista os privilégios que você pode conceder em uma exibição semântica.

Os seguintes privilégios em uma exibição semântica são necessários para trabalhar com a exibição:

  • Qualquer privilégio (por exemplo, MONITOR, REFERENCES ou SELECT) em uma exibição é necessário para executar o comando DESCRIBE SEMANTIC VIEW nessa exibição.

  • Qualquer privilégio em uma exibição é necessário para exibi-la na saída do comando SHOW SEMANTIC VIEWS.

  • SELECT é necessário para consultar a exibição semântica.

Nota

Para consultar uma exibição semântica, você não precisa do privilégio SELECT nas tabelas usadas na exibição semântica. Você só precisa do privilégio SELECT na própria exibição semântica.

Esse comportamento é consistente com os privilégios necessários para consultar exibições padrão.

Para usar uma exibição semântica que não é de sua propriedade no Cortex Analyst, você deve usar uma função que tenha os privilégios REFERENCES e SELECT nessa exibição.

Para conceder os privilégios REFERENCES eSELECT em uma exibição semântica, use comando GRANT <privilégios> … TO ROLE. Por exemplo, para conceder os privilégios REFERENCES eSELECT na exibição semântica chamada my_semantic_view à função my_analyst_role, você pode executar a seguinte instrução:

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

Se tiver um esquema contendo exibições semânticas que deseja compartilhar com usuários Cortex Analyst, você pode usar concessões futuras para conceder os privilégios para qualquer exibição semântica criada nesse esquema. Por exemplo:

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