Funciones de tabla

Una función de tabla, también llamada función con valor de tabla (TVF), es una función definida por el usuario que muestra una tabla. Puedes usar una función de tabla en cualquier lugar en el que puedas usar una tabla. Las funciones de tabla se comportan de manera similar a las vistas, pero una función de tabla puede tomar parámetros.

Crea funciones de tabla

Para crear una función de tabla, usa la sentencia CREATE TABLE FUNCTION. Una función de tabla contiene una consulta que produce una tabla. La función muestra el resultado de la consulta. La siguiente función de tabla toma un parámetro INT64 y usa este valor dentro de una cláusula WHERE en una consulta en un conjunto de datos públicos llamado 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 otras maneras, puedes pasar varios parámetros a una función de tabla. La siguiente función de tabla filtra los datos por año y prefijo de nombre:

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 la tabla

Puedes configurar los parámetros de la TVF para que sean tablas. Después del nombre del parámetro de la tabla, debes especificar el esquema de tabla requerido de forma explícita, de la misma manera en que especificas los campos de una struct. El argumento de tabla que pasas a la TVF puede contener columnas adicionales además de las especificadas en el esquema de parámetros, y las columnas pueden aparecer en cualquier orden.

La siguiente función de tabla devuelve una tabla que contiene las ventas totales de item_name de la tabla 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
);

Nombres de parámetros

Si un parámetro de función de tabla coincide con el nombre de una columna de tabla, puede crear una referencia ambigua. En ese caso, BigQuery interpreta el nombre como una referencia a la columna de tabla, no al parámetro. Se recomienda usar nombres de parámetros que sean distintos de los nombres de cualquier columna de tabla a la que se haga referencia.

Usa funciones de tabla

Puedes llamar a una función de tabla en cualquier contexto en el que una tabla sea válida. En el siguiente ejemplo, se llama a la función mydataset.names_by_year en la cláusula FROM de una sentencia SELECT:

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

Los resultados se ven de la siguiente manera:

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

Puedes unir el resultado de una función de tabla con otra tabla:

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

También puedes usar una función de tabla en una subconsulta:

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

Cuando llamas a una función de tabla que tiene un parámetro de tabla, debes usar la palabra clave TABLE antes del nombre del argumento de tabla. El argumento de tabla puede tener columnas que no se enumeran en el esquema de parámetros de la tabla:

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

Enumera funciones de tabla

Las funciones de tabla son un tipo de rutina. Para enumerar todas las rutinas en un conjunto de datos, consulta Enumera rutinas.

Borra funciones de la tabla

Para borrar una función de tabla, usa la sentencia DROP TABLE FUNCTION:

DROP TABLE FUNCTION mydataset.names_by_year

Autoriza rutinas

Puedes autorizar funciones de tabla como rutinas. Las rutinas autorizadas te permiten compartir resultados de consultas con usuarios o grupos específicos sin darles acceso a las tablas subyacentes que generaron los resultados. Por ejemplo, una rutina autorizada puede calcular una agregación en los datos o buscar un valor de tabla y usar ese valor en un cálculo. Para obtener más información, consulta Rutinas autorizadas.

Limitaciones

  • El cuerpo de la consulta debe ser una sentencia SELECT y no puede modificar nada. Por ejemplo, las declaraciones de lenguaje de definición de datos (DDL) y de lenguaje de manipulación de datos (DML) no están permitidas en las funciones de tabla. Si necesitas efectos secundarios, considera escribir un procedimiento en su lugar.

  • Las funciones de tabla deben almacenarse en la misma ubicación que las tablas a las que hacen referencia.

Cuotas

Para obtener más información sobre las cuotas y los límites de las funciones de tabla, consulta Cuotas y límites.