Consulta de exibições semânticas

Para consultar uma exibição semântica, é possível usar uma instrução SELECT padrão. Nessa instrução, você pode usar uma das seguintes abordagens:

  • Especificar a cláusula SEMANTIC_VIEW na cláusula FROM. Por exemplo:

    SELECT * FROM SEMANTIC_VIEW(
        tpch_analysis
        DIMENSIONS customer.customer_market_segment
        METRICS orders.order_average_value
      )
      ORDER BY customer_market_segment;
    
    Copy

    For information, see Specifying the SEMANTIC_VIEW clause in the FROM clause.

  • Especificar o nome da exibição semântica na cláusula FROM. Por exemplo:

    SELECT customer_market_segment, AGG(order_average_value)
      FROM tpch_analysis
      GROUP BY customer_market_segment
      ORDER BY customer_market_segment;
    
    Copy

    For information, see Specifying the name of the semantic view in the FROM clause.

Privilégios necessários para consultar uma exibição semântica

Se você estiver usando uma função que não seja proprietária da exibição semântica, deverá receber o privilégio SELECT nessa exibição semântica para consultá-la.

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 obter informações sobre a concessão de privilégios em exibições semânticas, consulte Concessão de privilégios em exibições semânticas.

Specifying the SEMANTIC_VIEW clause in the FROM clause

Para consultar uma exibição semântica, você pode especificar a cláusula SEMANTIC_VIEW na cláusula FROM.

The following example selects the customer_market_segment dimension and the order_average_value metric from the tpch_analysis semantic view, which you defined earlier:

SELECT * FROM SEMANTIC_VIEW(
    tpch_analysis
    DIMENSIONS customer.customer_market_segment
    METRICS orders.order_average_value
  )
  ORDER BY customer_market_segment;
Copy
+-------------------------+---------------------+
| CUSTOMER_MARKET_SEGMENT | ORDER_AVERAGE_VALUE |
+-------------------------+---------------------+
| AUTOMOBILE              |     142570.25947219 |
| FURNITURE               |     142563.63314267 |
| MACHINERY               |     142655.91550608 |
| HOUSEHOLD               |     141659.94753445 |
| BUILDING                |     142425.37987558 |
+-------------------------+---------------------+

Observe que você pode definir um alias para uma dimensão ou métrica especificando o alias após o nome da dimensão ou métrica. Você também pode especificar a palavra-chave opcional AS antes do alias. O exemplo a seguir executa a mesma consulta, mas usa os aliases segment e average para a dimensão e a métrica retornadas nos resultados.

SELECT * FROM SEMANTIC_VIEW(
    tpch_analysis
    DIMENSIONS customer.customer_market_segment AS segment
    METRICS orders.order_average_value average
  )
  ORDER BY segment;
Copy
+------------+-----------------+
| SEGMENT    |         AVERAGE |
|------------+-----------------|
| AUTOMOBILE | 142570.25947219 |
| BUILDING   | 142425.37987558 |
| FURNITURE  | 142563.63314267 |
| HOUSEHOLD  | 141659.94753445 |
| MACHINERY  | 142655.91550608 |
+------------+-----------------+

O exemplo a seguir seleciona a dimensão customer_name e o fato c_customer_order_count da exibição semântica tpch_analysis:

SELECT * FROM SEMANTIC_VIEW(
    tpch_analysis
    DIMENSIONS customer.customer_name
    FACTS customer.c_customer_order_count
  )
  ORDER BY customer_name
  LIMIT 5;
Copy
+--------------------+------------------------+
| CUSTOMER_NAME      | C_CUSTOMER_ORDER_COUNT |
|--------------------+------------------------|
| Customer#000000001 |                      9 |
| Customer#000000002 |                     11 |
| Customer#000000003 |                      0 |
| Customer#000000004 |                     20 |
| Customer#000000005 |                     10 |
+--------------------+------------------------+

Guidelines for specifying the SEMANTIC_VIEW clause

When specifying the SEMANTIC_VIEW clause, follow these guidelines:

  • Na cláusula SEMANTIC_VIEW, você deve especificar pelo menos uma das seguintes cláusulas:

    • METRICS

    • DIMENSIONS

    • FACTS

    Não é possível omitir todas essas cláusulas da cláusula SEMANTIC_VIEW.

  • Ao especificar uma combinação dessas cláusulas, observe o seguinte:

    • Não é possível especificar FACTS e METRICS na mesma cláusula SEMANTIC_VIEW.

    • Embora você possa especificar FACTS e DIMENSIONS em uma consulta, você deve fazê-lo somente se as dimensões puderem determinar os fatos de forma única.

      A consulta agrupa os resultados por dimensões. Se os fatos não dependem das dimensões, os resultados podem ser não determinísticos.

    • Se você especificar FACTS e DIMENSIONS, todos os fatos e as dimensões usados na consulta (incluindo aqueles especificados na cláusula WHERE) deverão ser definidos na mesma tabela lógica.

    • Se você especificar uma dimensão e uma métrica, a tabela lógica para a dimensão deverá estar relacionada à tabela lógica para a métrica.

      Além disso, a tabela lógica para a dimensão deve ter um nível igual ou inferior de granularidade do que a tabela lógica para a métrica.

      Para determinar quais dimensões atendem a esses critérios, você pode executar o comando SHOW SEMANTIC DIMENSIONS FOR METRIC.

      Para obter mais detalhes, consulte Escolha das dimensões que você pode retornar para uma determinada métrica.

  • Na cláusula DIMENSIONS, você pode especificar uma expressão que se refere a um fato. Da mesma forma, na cláusula FACTS, você pode especificar uma expressão que se refere a uma dimensão. Por exemplo:

    -- Dimension expression that refers to a fact
    DIMENSIONS my_table.my_fact
    
    -- Fact expression that refers to a dimension
    FACTS my_table.my_dimension
    
    Copy

    Uma das principais diferenças entre o uso de DIMENSIONS e FACTS é que a consulta agrupa os resultados pelas dimensões e expressões especificadas na cláusula DIMENSIONS.

  • In the METRICS clause, you can specify an expression that includes:

    • Uma expressão escalar que se refere a métricas;

    • Uma agregação de dimensões ou fatos.

  • Especifique as cláusulas METRICS, DIMENSIONS e FACTS na ordem em que você deseja que apareçam nos resultados.

    Se você quiser que as dimensões apareçam primeiro nos resultados, especifique DIMENSIONS antes de METRICS. Caso contrário, especifique primeiro METRICS.

    Por exemplo, suponha que você especifique primeiro a cláusula METRICS:

    SELECT * FROM SEMANTIC_VIEW(
        tpch_analysis
        METRICS customer.customer_order_count
        DIMENSIONS customer.customer_name
      )
      ORDER BY customer_name
      LIMIT 5;
    
    Copy

    Na saída, a primeira coluna é a coluna de métrica (customer_order_count) e a segunda coluna é a coluna de dimensão (customer_name):

    +----------------------+--------------------+
    | CUSTOMER_ORDER_COUNT | CUSTOMER_NAME      |
    |----------------------+--------------------|
    |                    6 | Customer#000000001 |
    |                    7 | Customer#000000002 |
    |                    0 | Customer#000000003 |
    |                   20 | Customer#000000004 |
    |                    4 | Customer#000000005 |
    +----------------------+--------------------+
    

    Se, em vez disso, você especificar primeiro a cláusula DIMENSIONS:

    SELECT * FROM SEMANTIC_VIEW(
        tpch_analysis
        DIMENSIONS customer.customer_name
        METRICS customer.customer_order_count
      )
      ORDER BY customer_name
      LIMIT 5;
    
    Copy

    Na saída, a primeira coluna é a coluna de dimensão (customer_name) e a segunda coluna é a coluna de métrica (customer_order_count):

    +--------------------+----------------------+
    | CUSTOMER_NAME      | CUSTOMER_ORDER_COUNT |
    |--------------------+----------------------|
    | Customer#000000001 |                    6 |
    | Customer#000000002 |                    7 |
    | Customer#000000003 |                    0 |
    | Customer#000000004 |                   20 |
    | Customer#000000005 |                    4 |
    +--------------------+----------------------+
    
  • Você pode usar a relação definida por uma cláusula SEMANTIC_VIEW em outras construções SQL, incluindo JOIN, PIVOT, UNPIVOT, GROUP BY e expressões de tabela comuns (CTEs).

  • Os cabeçalhos das colunas de saída usam os nomes não qualificados das métricas e dimensões.

    Se você tiver várias métricas e dimensões com os mesmos nomes, use um alias de tabela para atribuir nomes diferentes aos cabeçalhos das colunas. Consulte Tratamento de nomes de colunas duplicados na saída.

Para retornar todas as métricas ou dimensões em uma determinada tabela lógica, use um asterisco como curinga, qualificado pelo nome da tabela lógica. Por exemplo, para retornar todas as métricas e dimensões definidas na tabela lógica customer:

SELECT * FROM SEMANTIC_VIEW(
  tpch_analysis
  DIMENSIONS customer.*
  METRICS customer.*
);
Copy
+-----------------------+-------------------------+--------------------+----------------------+----------------------+----------------+----------------------+
| CUSTOMER_COUNTRY_CODE | CUSTOMER_MARKET_SEGMENT | CUSTOMER_NAME      | CUSTOMER_NATION_NAME | CUSTOMER_REGION_NAME | CUSTOMER_COUNT | CUSTOMER_ORDER_COUNT |
|-----------------------+-------------------------+--------------------+----------------------+----------------------+----------------+----------------------|
| 18                    | BUILDING                | Customer#000034857 | INDIA                | ASIA                 |              1 |                    0 |
| 14                    | AUTOMOBILE              | Customer#000145116 | EGYPT                | MIDDLE EAST          |              1 |                    0 |
...

Examples of specifying the SEMANTIC_VIEW clause

Os exemplos a seguir usam a visualização tpch_analysis definida em Exemplo de uso do SQL para criar uma exibição semântica:

Recuperação de métrica

A instrução a seguir recupera a contagem total de clientes consultando uma métrica:

SELECT * FROM SEMANTIC_VIEW(
    tpch_analysis
    METRICS customer.customer_count
  );
Copy
+----------------+
| CUSTOMER_COUNT |
+----------------+
|          15000 |
+----------------+

Agrupamento de dados métricos por uma dimensão

A instrução a seguir agrupa dados métricos (order_average_value) por uma dimensão (customer_market_segment):

SELECT * FROM SEMANTIC_VIEW(
    tpch_analysis
    DIMENSIONS customer.customer_market_segment
    METRICS orders.order_average_value
  );
Copy
+-------------------------+---------------------+
| CUSTOMER_MARKET_SEGMENT | ORDER_AVERAGE_VALUE |
+-------------------------+---------------------+
| AUTOMOBILE              |     142570.25947219 |
| FURNITURE               |     142563.63314267 |
| MACHINERY               |     142655.91550608 |
| HOUSEHOLD               |     141659.94753445 |
| BUILDING                |     142425.37987558 |
+-------------------------+---------------------+

Usando a subcláusula SEMANTIC_VIEW com outras construções

O exemplo a seguir demonstra como você pode usar dimensões e métricas na subcláusula SEMANTIC_VIEW com outras construções SQL para filtrar, classificar e limitar os resultados:

SELECT * FROM SEMANTIC_VIEW(
    tpch_analysis
    DIMENSIONS customer.customer_name
    METRICS orders.average_line_items_per_order,
            orders.order_average_value
  )
  WHERE average_line_items_per_order > 4
  ORDER BY average_line_items_per_order DESC
  LIMIT 5;
Copy
+--------------------+------------------------------+---------------------+
| CUSTOMER_NAME      | AVERAGE_LINE_ITEMS_PER_ORDER | ORDER_AVERAGE_VALUE |
+--------------------+------------------------------+---------------------+
| Customer#000045678 |                         6.87 |           175432.21 |
| Customer#000067890 |                         6.42 |           182376.58 |
| Customer#000012345 |                         5.93 |           169847.42 |
| Customer#000034567 |                         5.76 |           178952.36 |
| Customer#000056789 |                         5.64 |           171248.75 |
+--------------------+------------------------------+---------------------+

Especificar expressões escalares que usam dimensões

O exemplo a seguir usa uma expressão escalar que se refere a uma dimensão na cláusula DIMENSIONS:

SELECT * FROM SEMANTIC_VIEW(
    tpch_analysis
    DIMENSIONS DATE_PART('year', orders.order_date) AS year
  )
  ORDER BY year;
Copy
+------+
| YEAR |
|------|
| 1992 |
| 1993 |
| 1994 |
| 1995 |
| 1996 |
| 1997 |
| 1998 |
+------+

Especificar a cláusula WHERE

O exemplo a seguir especifica uma cláusula WHERE que se refere a uma dimensão na cláusula DIMENSIONS:

SELECT * FROM SEMANTIC_VIEW(
    tpch_analysis
    DIMENSIONS orders.order_date
    METRICS orders.average_line_items_per_order,
            orders.order_average_value
    WHERE orders.order_date > '1995-01-01'
  )
  ORDER BY order_date ASC
  LIMIT 5;
Copy
+------------+------------------------------+---------------------+
| ORDER_DATE | AVERAGE_LINE_ITEMS_PER_ORDER | ORDER_AVERAGE_VALUE |
|------------+------------------------------+---------------------|
| 1995-01-02 |                     3.884547 |     151237.54900533 |
| 1995-01-03 |                     3.894819 |     145751.84384615 |
| 1995-01-04 |                     3.838863 |     145331.39167457 |
| 1995-01-05 |                     4.040689 |     150723.67353678 |
| 1995-01-06 |                     3.990755 |     152786.54109399 |
+------------+------------------------------+---------------------+

Especificação de fatos na cláusula WHERE

O seguinte exemplo usa o fato region.r_name em uma condição na cláusula WHERE:

SELECT * FROM SEMANTIC_VIEW(
    tpch_analysis
    FACTS customer.c_customer_order_count
    WHERE orders.order_date < '2021-01-01' AND region.r_name = 'AMERICA'
  );
Copy

Specifying the name of the semantic view in the FROM clause

Você pode especificar o nome da exibição semântica na cláusula FROM de uma instrução SELECT, como faria para consultar uma exibição SQL padrão:

SELECT [ DISTINCT ]
    {
      [<qualifiers>.]<dimension_or_fact>                          |
      <scalar_expression_over_dimension_or_fact>                  |
      { MIN | MAX | ANY_VALUE | AGG }( [<qualifiers>.]<metric> )  |
      <aggregate_function>( [<qualifiers>.]<dimension_for_fact> )
    }
    [ , ... ]
  FROM <semantic_view> [ AS <alias> ]
  [ WHERE <expr_using_dimensions_or_facts> ]
  [ GROUP BY <expr_using_dimensions_or_facts> [ , ... ] ]
  [ HAVING <expr_using_metrics> ]
  [ ORDER BY ... ]
  [ LIMIT ... ]
Copy

Internamente, essa instrução é reescrita como uma instrução SELECT que usa a cláusula SEMANTIC_VIEW:

  • As expressões que você especifica na cláusula GROUP BY são reescritas na cláusula DIMENSIONS, na cláusula SEMANTIC_VIEW.

    Na instrução SELECT, se você usar uma expressão que não esteja na cláusula GROUP BY (por exemplo, uma expressão de dimensão na lista SELECT), a reescrita usará essa expressão na cláusula FACTS, na cláusula SEMANTIC_VIEW.

  • Ao se referir a uma métrica definida em uma exibição semântica, é necessário passar a métrica para a função AGG, MIN, MAX ou ANY_VALUE.

  • Você pode selecionar métricas especiais passando uma dimensão ou um fato para qualquer função de agregação.

  • Quaisquer outros valores calculados que não se encaixem nas duas primeiras categorias são considerados referências de fatos.

As próximas seções explicam esses requisitos em mais detalhes:

Requisitos para dimensões e métricas em uma instrução SELECT

Na instrução SELECT, você só pode se referir a dimensões e métricas que tenham nomes distintos e que não sejam distinguidas pelo próprio nome da tabela lógica. Por exemplo, suponha que uma exibição semântica tenha duas dimensões com o nome não qualificado name:

DIMENSIONS (
  nation.name AS nation.n_name,
  region.name AS region.r_name
);
Copy

Na instrução SELECT, quando você especifica o nome qualificado de uma dimensão ou métrica, o qualificador é interpretado como o nome da exibição semântica, não o nome de uma tabela lógica:

SELECT nation.name, region.name
  FROM duplicate_names
  GROUP BY nation.name, region.name;
Copy
000904 (42000): SQL compilation error: error line 1 at position 7
invalid identifier 'NATION.NAME'

Selecting metrics

Se quiser selecionar uma métrica definida em uma exibição semântica, é necessário passar a métrica para uma das seguintes funções:

  • MIN

  • MAX

  • ANY_VALUE

  • AGG (uma função de agregação especial para métricas em exibições semânticas)

For example:

SELECT AGG(order_average_value) FROM tpch_analysis;
Copy

Nota

A função de agregação que você usa (por exemplo, MIN, MAX ou ANY_VALUE) não tem efeito sobre a métrica porque a função avalia um valor da métrica.

Por exemplo, passar a métrica para a função MIN retorna o mínimo de um valor da métrica, que é o mesmo que o valor dessa métrica.

Por esse motivo, não há diferença entre passar a métrica para MIN, MAX, ANY_VALUE ou AGG.

In the SELECT list, you can specify an expression that uses a metric. For example:

SELECT AGG(order_average_value) * 10 FROM tpch_analysis;
Copy

Você também pode definir e selecionar métricas especiais passando uma dimensão ou um fato para qualquer função de agregação. Por exemplo:

SELECT COUNT(customer_market_segment) FROM tpch_analysis;
Copy

Selecting dimensions

Se a lista SELECT inclui dimensões, você deve especificá-las na cláusula GROUP BY. Por exemplo:

SELECT customer_market_segment, customer_nation_name, AGG(order_average_value)
  FROM tpch_analysis
  GROUP BY customer_market_segment, customer_nation_name;
Copy

Na lista SELECT e na cláusula GROUP BY, você pode especificar uma dimensão ou uma expressão escalar que usa uma dimensão ou um fato. Por exemplo:

SELECT LOWER(customer_nation_name), AGG(order_average_value)
  FROM tpch_analysis
  GROUP BY customer_nation_name;
Copy

Especificar a cláusula WHERE

Na cláusula WHERE, você só pode usar expressões condicionais que se refiram a dimensões ou fatos. Por exemplo:

SELECT customer_market_segment, AGG(order_average_value)
  FROM tpch_analysis
  WHERE customer_market_segment = 'BUILDING'
  GROUP BY customer_market_segment;
Copy

As dimensões devem ser acessíveis por cada métrica usada na consulta.

Specifying the HAVING clause

Na cláusula HAVING, você só pode especificar métricas e deve passá-las para uma das funções de agregação listadas em Selecting metrics. Por exemplo:

SELECT customer_market_segment, AGG(order_average_value)
  FROM tpch_analysis
  GROUP BY customer_market_segment
  HAVING AGG(order_average_value) > 142500;
Copy

Limitações com a especificação do nome da exibição semântica na cláusula FROM

Não é possível especificar o seguinte na instrução SELECT:

  • Extensões da cláusula FROM, incluindo:

    • PIVOT

    • UNPIVOT

    • MATCH_RECOGNIZE

    • LATERAL

  • Junções

  • Window function calls

  • QUALIFY

  • Subconsultas

Escolha das dimensões que você pode retornar para uma determinada métrica

Ao especificar uma dimensão e uma métrica para retornar, a tabela base da dimensão deve estar relacionada à tabela base da métrica. Além disso, a tabela base da dimensão deve ter um nível de granularidade igual ou inferior à tabela base da métrica.

For example, suppose that you query the tpch_analysis semantic view that you created in Exemplo de uso do SQL para criar uma exibição semântica, and you want to return the orders.order_date dimension and the customer.customer_order_count metric:

SELECT * FROM SEMANTIC_VIEW (
  tpch_analysis
  DIMENSIONS orders.order_date
  METRICS customer.customer_order_count
);
Copy

Há falha na consulta porque a tabela orders para a dimensão order_date tem um nível de granularidade mais alto do que a tabela customer para a métrica customer_order_count:

010234 (42601): SQL compilation error:
Invalid dimension specified: The dimension entity 'ORDERS' must be related to and
  have an equal or lower level of granularity compared to the base metric or dimension entity 'CUSTOMER'.

Para listar as dimensões que você pode retornar com uma métrica específica, execute o comando SHOW SEMANTIC DIMENSIONS FOR METRIC. Por exemplo:

SHOW SEMANTIC DIMENSIONS IN tpch_analysis FOR METRIC customer_order_count;
Copy
+------------+-------------------------+-------------+----------+----------+---------+
| table_name | name                    | data_type   | required | synonyms | comment |
|------------+-------------------------+-------------+----------+----------+---------|
| CUSTOMER   | CUSTOMER_COUNTRY_CODE   | VARCHAR(15) | false    | NULL     | NULL    |
| CUSTOMER   | CUSTOMER_MARKET_SEGMENT | VARCHAR(10) | false    | NULL     | NULL    |
| CUSTOMER   | CUSTOMER_NAME           | VARCHAR(25) | false    | NULL     | NULL    |
| CUSTOMER   | CUSTOMER_NATION_NAME    | VARCHAR(25) | false    | NULL     | NULL    |
| CUSTOMER   | CUSTOMER_REGION_NAME    | VARCHAR(25) | false    | NULL     | NULL    |
| NATION     | NATION_NAME             | VARCHAR(25) | false    | NULL     | NULL    |
+------------+-------------------------+-------------+----------+----------+---------+

Tratamento de nomes de colunas duplicados na saída

As colunas de saída usam os nomes não qualificados das métricas e dimensões. Se você tiver várias métricas e dimensões com os mesmos nomes, várias colunas usarão o mesmo nome.

Para contornar isso, use um alias de tabela para atribuir nomes diferentes às colunas.

Por exemplo, suponha que você defina a seguinte exibição semântica, que define as dimensões nation.name e region.name:

CREATE OR REPLACE SEMANTIC VIEW duplicate_names

  TABLES (
    nation AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION PRIMARY KEY (n_nationkey),
    region AS SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.REGION PRIMARY KEY (r_regionkey)
  )

  RELATIONSHIPS (
    nation (n_regionkey) REFERENCES region
  )

  DIMENSIONS (
    nation.name AS nation.n_name,
    region.name AS region.r_name
  );
Copy

Se você consultar essa visualização e selecionar essas duas dimensões, a saída incluirá duas colunas denominadas name sem nenhum qualificador:

SELECT * FROM SEMANTIC_VIEW(
    duplicate_names
    DIMENSIONS nation.name, region.name
  );
Copy
+----------------+-------------+
| NAME           | NAME        |
+----------------+-------------+
| BRAZIL         | AMERICA     |
| MOROCCO        | AFRICA      |
| UNITED KINGDOM | EUROPE      |
| IRAN           | MIDDLE EAST |
| FRANCE         | EUROPE      |
| ...            | ...         |
+----------------+-------------+

Para não ambiguidade das colunas, use um alias de tabela para atribuir nomes de coluna diferentes (por exemplo, nation_name e region_name):

SELECT * FROM SEMANTIC_VIEW(
    duplicate_names
    DIMENSIONS nation.name, region.name
  ) AS table_alias(nation_name, region_name);
Copy
+----------------+-------------+
| NATION_NAME    | REGION_NAME |
+----------------+-------------+
| BRAZIL         | AMERICA     |
| MOROCCO        | AFRICA      |
| UNITED KINGDOM | EUROPE      |
| IRAN           | MIDDLE EAST |
| FRANCE         | EUROPE      |
| ...            | ...         |
+----------------+-------------+

Definição e consulta de métricas de função de janela

É possível definir métricas que chamam funções de janela e passam valores agregados. Elas são chamadas de métricas de função de janela.

Os seguintes exemplos ilustram a diferença entre a métrica de função de janela e a métrica que passa uma expressão no nível da linha para uma função de janela:

  • Veja abaixo uma métrica de função de janela:

    METRICS (
      table_1.metric_1 AS SUM(table_1.metric_3) OVER( ... )
    )
    
    Copy

    Neste exemplo, a função de janela SUM usa outra métrica (table_1.metric_3) como argumento.

    A métrica abaixo também é de função de janela:

    METRICS (
      table_1.metric_2 AS SUM(
        SUM(table_1.column_1)
      ) OVER( ... )
    )
    
    Copy

    Neste exemplo, a função de janela SUM usa uma expressão de métrica válida (SUM(table_1.column_1)) como argumento.

  • A métrica abaixo não é de função de janela:

    METRICS (
      table_1.metric_1 AS SUM(
        SUM(table_1.column_1) OVER( ... )
      )
    )
    
    Copy

    Neste exemplo, a função de janela SUM usa uma coluna (table_1.column_1) como argumento, e o resultado dessa chamada de função de janela é passado para uma chamada de função de agregação SUM separada.

As seguintes seções explicam como definir e consultar as métricas de função de janela:

Definição de métricas de função de janela

Ao especificar uma chamada de função de janela, use esta sintaxe, que está descrita em Parâmetros para métricas de função de janela.

O exemplo a seguir cria uma exibição semântica que inclui as definições de várias métricas de função de janela. O exemplo usa tabelas do banco de dados de amostra TPC-DS. Para obter informações sobre como acessar esse banco de dados, consulte Add the TPC-DS data set to your account.

CREATE OR REPLACE SEMANTIC VIEW sv_window_function_example
  TABLES (
    store_sales AS SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.store_sales,
    date AS SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.date_dim PRIMARY KEY (d_date_sk)
  )
  RELATIONSHIPS (
    sales_to_date AS store_sales(ss_sold_date_sk) REFERENCES date(d_date_sk)
  )
  DIMENSIONS (
    date.date AS d_date,
    date.d_date_sk AS d_date_sk,
    date.year AS d_year
  )
  METRICS (
    store_sales.total_sales_quantity AS SUM(ss_quantity)
      WITH SYNONYMS = ('Total sales quantity'),

    store_sales.avg_7_days_sales_quantity as AVG(total_sales_quantity)
      OVER (PARTITION BY EXCLUDING date.date, date.year ORDER BY date.date
        RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW)
      WITH SYNONYMS = ('Running 7-day average of total sales quantity'),

    store_sales.total_sales_quantity_30_days_ago AS LAG(total_sales_quantity, 30)
      OVER (PARTITION BY EXCLUDING date.date, date.year ORDER BY date.date)
      WITH SYNONYMS = ('Sales quantity 30 days ago'),

    store_sales.avg_7_days_sales_quantity_30_days_ago AS AVG(total_sales_quantity)
      OVER (PARTITION BY EXCLUDING date.date, date.year ORDER BY date.date
        RANGE BETWEEN INTERVAL '36 days' PRECEDING AND INTERVAL '30 days' PRECEDING)
      WITH SYNONYMS = ('Running 7-day average of total sales quantity 30 days ago')

  );
Copy

Você também pode usar outras métricas da mesma tabela lógica na definição da métrica. Por exemplo:

METRICS (
  orders.m3 AS SUM(m2) OVER (PARTITION BY m1 ORDER BY m2),
  orders.m4 AS ((SUM(m2) OVER (..)) / m1) + 1
)
Copy

Nota

Não é possível usar métricas de função de janela em cálculos no nível da linha (fatos e dimensões) ou nas definições de outras métricas.

Consulta de métricas de função de janela

Quando você consulta uma exibição semântica e a consulta retorna uma métrica de função de janela, você também deve retornar as dimensões especificadas em PARTITION BY dimension, PARTITION BY EXCLUDING dimension e ORDER BY dimension na instrução CREATE SEMANTIC VIEW para a exibição semântica.

Por exemplo, suponha que você especifique as dimensões date.date e date.year nas cláusulas PARTITION BY EXCLUDING e ORDER BY na definição da métrica store_sales.avg_7_days_sales_quantity:

CREATE OR REPLACE SEMANTIC VIEW sv_window_function_example
  ...
  DIMENSIONS (
    ...
    date.date AS d_date,
    ...
    date.year AS d_year
    ...
  )
  METRICS (
    ...
    store_sales.avg_7_days_sales_quantity as AVG(total_sales_quantity)
      OVER (PARTITION BY EXCLUDING date.date, date.year ORDER BY date.date
        RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW)
      WITH SYNONYMS = ('Running 7-day average of total sales quantity'),
    ...
  );
Copy

Se você retornar a métrica store_sales.avg_7_days_sales_quantity em uma consulta, também deverá retornar as dimensões date.date e date.year:

SELECT * FROM SEMANTIC_VIEW (
  sv_window_function_example
  DIMENSIONS date.date, date.year
  METRICS store_sales.avg_7_days_sales_quantity
);
Copy

Se você omitir as dimensões date.date e date.year, ocorrerá um erro.

010260 (42601): SQL compilation error:
Invalid semantic view query: Dimension 'DATE.DATE' used in a
   window function metric must be requested in the query.

Para determinar quais dimensões você deve especificar na consulta, execute o comando SHOW SEMANTIC DIMENSIONS FOR METRIC. Por exemplo, para determinar as dimensões que você deve especificar ao recuperar a métrica store_sales.avg_7_days_sales_quantity, execute este comando:

SHOW SEMANTIC DIMENSIONS IN sv_window_function_example FOR METRIC avg_7_days_sales_quantity;
Copy

Na saída do comando, a coluna required contém true para as dimensões que você deve especificar na consulta.

+------------+-----------+--------------+----------+----------+---------+
| table_name | name      | data_type    | required | synonyms | comment |
|------------+-----------+--------------+----------+----------+---------|
| DATE       | DATE      | DATE         | true     | NULL     | NULL    |
| DATE       | D_DATE_SK | NUMBER(38,0) | false    | NULL     | NULL    |
| DATE       | YEAR      | NUMBER(38,0) | true     | NULL     | NULL    |
+------------+-----------+--------------+----------+----------+---------+

Os outros exemplos a seguir consultam as métricas de função de janela definidas em Definição de métricas de função de janela. Observe que a cláusula DIMENSIONS inclui as dimensões especificadas nas cláusulas PARTITION BY EXCLUDING e ORDER BY das definições das métricas.

O seguinte exemplo retorna a quantidade de vendas dos 30 dias anteriores:

SELECT * FROM SEMANTIC_VIEW (
  sv_window_function_example
  DIMENSIONS date.date, date.year
  METRICS store_sales.total_sales_quantity_30_days_ago
);
Copy

O seguinte exemplo retorna a média por período consecutivo de 7 dias da quantidade total de vendas dos 30 dias anteriores:

SELECT * FROM SEMANTIC_VIEW (
  sv_window_function_example
  DIMENSIONS date.date, date.year
  METRICS store_sales.avg_7_days_sales_quantity_30_days_ago
);
Copy