Funções de tabela

Uma função de tabela, também denominada função de valor de tabela (TVF), é uma função definida pelo utilizador que devolve uma tabela. Pode usar uma função de tabela em qualquer lugar onde possa usar uma tabela. As funções de tabela comportam-se de forma semelhante às vistas, mas uma função de tabela pode receber parâmetros.

Crie funções de tabela

Para criar uma função de tabela, use a declaração CREATE TABLE FUNCTION. Uma função de tabela contém uma consulta que produz uma tabela. A função devolve o resultado da consulta. A seguinte função de tabela usa um parâmetro INT64 e usa este valor numa cláusula WHERE numa consulta sobre um conjunto de dados público denominado bigquery-public-data.usa_names.usa_1910_current:

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
AS (
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE year = y
  GROUP BY year, name
);

Para filtrar de outras formas, pode transmitir vários parâmetros a uma função de tabela. A função de tabela seguinte filtra os dados por ano e prefixo do nome:

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year_and_prefix(
  y INT64, z STRING)
AS (
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE
    year = y
    AND STARTS_WITH(name, z)
  GROUP BY year, name
);

Parâmetros de tabela

Pode definir parâmetros TVF como tabelas. Após o nome do parâmetro da tabela, tem de especificar explicitamente o esquema da tabela necessário, da mesma forma que especifica os campos de uma struct. O argumento da tabela que transmite à TVF pode conter colunas adicionais além das especificadas no esquema de parâmetros, e as colunas podem aparecer em qualquer ordem.

A função de tabela seguinte devolve uma tabela que contém o total de vendas de item_name da tabela orders:

CREATE TABLE FUNCTION mydataset.compute_sales (
  orders TABLE<sales INT64, item STRING>, item_name STRING)
AS (
  SELECT SUM(sales) AS total_sales, item
  FROM orders
  WHERE item = item_name
  GROUP BY item
);

Nomes de parâmetros

Se um parâmetro de função de tabela corresponder ao nome de uma coluna de tabela, pode criar uma referência ambígua. Nesse caso, o BigQuery interpreta o nome como uma referência à coluna da tabela e não ao parâmetro. A prática recomendada é usar nomes de parâmetros distintos dos nomes de quaisquer colunas de tabelas referenciadas.

Use funções de tabela

Pode chamar uma função de tabela em qualquer contexto em que uma tabela seja válida. O exemplo seguinte chama a função mydataset.names_by_year na cláusula FROM de uma declaração SELECT:

SELECT * FROM mydataset.names_by_year(1950)
  ORDER BY total DESC
  LIMIT 5

Os resultados têm o seguinte aspeto:

+------+--------+-------+
| year |  name  | total |
+------+--------+-------+
| 1950 | James  | 86447 |
| 1950 | Robert | 83717 |
| 1950 | Linda  | 80498 |
| 1950 | John   | 79561 |
| 1950 | Mary   | 65546 |
+------+--------+-------+

Pode unir o resultado de uma função de tabela com outra tabela:

SELECT *
  FROM `bigquery-public-data.samples.shakespeare` AS s
  JOIN mydataset.names_by_year(1950) AS n
  ON n.name = s.word

Também pode usar uma função de tabela numa subconsulta:

SELECT ARRAY(
  SELECT name FROM mydataset.names_by_year(1950)
  ORDER BY total DESC
  LIMIT 5)

Quando chama uma função de tabela que tem um parâmetro de tabela, tem de usar a palavra-chave TABLE antes do nome do argumento de tabela. O argumento da tabela pode ter colunas não listadas no esquema de parâmetros da tabela:

CREATE TABLE FUNCTION mydataset.compute_sales (
  orders TABLE<sales INT64, item STRING>, item_name STRING)
AS (
  SELECT SUM(sales) AS total_sales, item
  FROM orders
  WHERE item = item_name
  GROUP BY item
);

WITH my_orders AS (
    SELECT 1 AS sales, "apple" AS item, 0.99 AS price
    UNION ALL
    SELECT 2, "banana", 0.49
    UNION ALL
    SELECT 5, "apple", 0.99)
SELECT *
FROM mydataset.compute_sales(TABLE my_orders, "apple");

/*-------------+-------+
 | total_sales | item  |
 +-------------+-------+
 | 6           | apple |
 +-------------+-------*/

Apresentar funções de tabelas

As funções de tabela são um tipo de rotina. Para listar todas as rotinas num conjunto de dados, consulte Listar rotinas.

Elimine funções de tabela

Para eliminar uma função de tabela, use a declaração: DROP TABLE FUNCTION

DROP TABLE FUNCTION mydataset.names_by_year

Autorize rotinas

Pode autorizar funções de tabela como rotinas. As rotinas autorizadas permitem-lhe partilhar resultados de consultas com utilizadores ou grupos específicos sem lhes conceder acesso às tabelas subjacentes que geraram os resultados. Por exemplo, uma rotina autorizada pode calcular uma agregação sobre dados ou procurar um valor de tabela e usar esse valor num cálculo. Para mais informações, consulte o artigo Rotinas autorizadas.

Limitações

  • O corpo da consulta tem de ser uma declaração SELECT e não pode modificar nada. Por exemplo, as declarações de linguagem de definição de dados (LDD) e linguagem de manipulação de dados (LMD) não são permitidas em funções de tabela. Se precisar de efeitos secundários, considere escrever um procedimento.

  • As funções de tabela têm de ser armazenadas na mesma localização que as tabelas a que fazem referência.

Quotas

Para mais informações sobre as quotas e os limites das funções de tabela, consulte o artigo Quotas e limites.