Sintaxis, funciones y operadores de SQL heredados
Este documento detalla la sintaxis, las funciones y los operadores de las consultas SQL heredadas. La sintaxis de consulta preferida para BigQuery es GoogleSQL. Para obtener información sobre GoogleSQL, consulte Sintaxis de consulta de GoogleSQL .
Sintaxis de consulta
Nota: Las palabras clave no distinguen entre mayúsculas y minúsculas. En este documento, palabras clave como SELECT
se escriben con mayúscula inicial a modo de ejemplo.
cláusula SELECT
La cláusula SELECT
especifica una lista de expresiones que se calcularán. Las expresiones de la cláusula SELECT
pueden contener nombres de campo, literales y llamadas a funciones (incluidas funciones de agregado y de ventana ), así como combinaciones de las tres. La lista de expresiones está separada por comas.
Se puede asignar un alias a cada expresión añadiendo un espacio seguido de un identificador después de la expresión. La palabra clave opcional AS
se puede añadir entre la expresión y el alias para mejorar la legibilidad. Los alias definidos en una cláusula SELECT
se pueden referenciar en las cláusulas GROUP BY
, HAVING
y ORDER BY
de la consulta, pero no en las cláusulas FROM
, WHERE
u OMIT RECORD IF
ni en otras expresiones de la misma cláusula SELECT
.
Notas:
- Si utiliza una función de agregación en su cláusula
SELECT
, debe usarla en todas las expresiones o su consulta debe tener una cláusulaGROUP BY
que incluya todos los campos no agregados de su cláusulaSELECT
como claves de agrupación. Por ejemplo:#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus; /* Succeeds because all non-aggregated fields are group keys. */
#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word; /* Fails because corpus is not aggregated nor is it a group key. */
- Puede usar corchetes para escapar palabras reservadas y usarlas como nombre de campo y alias. Por ejemplo, si tiene una columna llamada "partición", que es una palabra reservada en la sintaxis de BigQuery, las consultas que hacen referencia a ese campo fallan con mensajes de error poco claros a menos que lo escape con corchetes:
SELECT [partition] FROM ...
Ejemplo
Este ejemplo define alias en la cláusula SELECT
y luego hace referencia a uno de ellos en la cláusula ORDER BY
. Observe que la palabra " column" no se puede referenciar mediante el alias "word_alias" en la cláusula WHERE
; debe referenciarse por su nombre. El alias "len" tampoco es visible en la cláusula WHERE
. Sería visible para una cláusula HAVING
.
#legacySQL SELECT word AS word_alias, LENGTH(word) AS len FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS 'th' ORDER BY len;
Modificador WITHIN para funciones agregadas
aggregate_function WITHIN RECORD [ [ AS ] alias ]
La palabra clave WITHIN
hace que la función de agregación agregue valores repetidos dentro de cada registro. Por cada registro de entrada, se generará exactamente una salida agregada. Este tipo de agregación se denomina agregación con ámbito . Dado que la agregación con ámbito genera una salida para cada registro, se pueden seleccionar expresiones no agregadas junto con expresiones con ámbito agregado sin usar una cláusula GROUP BY
.
Lo más común es usar el ámbito RECORD
al usar la agregación con ámbito. Si tiene un esquema anidado y repetido muy complejo, podría necesitar realizar agregaciones dentro de ámbitos de subregistro. Esto se puede lograr reemplazando la palabra clave RECORD
en la sintaxis anterior por el nombre del nodo del esquema donde desea que se realice la agregación. Para obtener más información sobre este comportamiento avanzado, consulte "Tratar con datos" .
Ejemplo
Este ejemplo realiza una agregación COUNT
con alcance y luego filtra y ordena los registros por el valor agregado.
#legacySQL SELECT repository.url, COUNT(payload.pages.page_name) WITHIN RECORD AS page_count FROM [bigquery-public-data:samples.github_nested] HAVING page_count > 80 ORDER BY page_count DESC;
cláusula FROM
FROM [project_name:]datasetId.tableId [ [ AS ] alias ] | (subquery) [ [ AS ] alias ] |JOIN
clause |FLATTEN
clause | table wildcard function
La cláusula FROM
especifica los datos de origen que se consultarán. Las consultas de BigQuery pueden ejecutarse directamente sobre tablas, subconsultas, tablas unidas y tablas modificadas mediante operadores específicos que se describen a continuación. Las combinaciones de estas fuentes de datos se pueden consultar mediante la coma , que es el operador UNION ALL
en BigQuery.
Tablas de referencia
Al hacer referencia a una tabla, se deben especificar tanto datasetId como tableId ; project_name es opcional. Si no se especifica project_name , BigQuery usa el proyecto actual de forma predeterminada. Si el nombre del proyecto incluye un guion, debe escribir toda la referencia de la tabla entre corchetes.
Ejemplo
[my-dashed-project:dataset1.tableName]
Se puede asignar un alias a las tablas añadiendo un espacio seguido de un identificador después del nombre de la tabla. La palabra clave opcional AS
se puede añadir entre el ID de la tabla y el alias para mejorar la legibilidad.
Al hacer referencia a columnas de una tabla, puede usar el nombre de columna simple o prefijar el nombre de columna con el alias, si lo especificó, o con datasetId y tableId, siempre que no se haya especificado project_name . Project_name no se puede incluir en el prefijo de columna porque no se permiten los dos puntos en los nombres de campo.
Ejemplos
Este ejemplo hace referencia a una columna sin prefijo de tabla.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare];
Este ejemplo antepone datasetId y tableId al nombre de la columna. Tenga en cuenta que no se puede incluir project_name en este ejemplo. Este método solo funcionará si el conjunto de datos está en su proyecto predeterminado actual.
#legacySQL SELECT samples.shakespeare.word FROM samples.shakespeare;
Este ejemplo antepone al nombre de la columna un alias de tabla.
#legacySQL SELECT t.word FROM [bigquery-public-data:samples.shakespeare] AS t;
Tablas particionadas por rango de enteros
El SQL heredado admite el uso de decoradores de tabla para direccionar una partición específica en una tabla particionada por rango de enteros. La clave para direccionar una partición de rango es el inicio del rango.
El siguiente ejemplo consulta la partición de rango que comienza con 30:
#legacySQL SELECT * FROM dataset.table$30;
Tenga en cuenta que no puede usar SQL heredado para realizar consultas en una tabla particionada completa por rango de enteros. En su lugar, la consulta devuelve un error como el siguiente:
Querying tables partitioned on a field is not supported in Legacy SQL
Uso de subconsultas
Una subconsulta es una sentencia SELECT
anidada entre paréntesis. Las expresiones calculadas en la cláusula SELECT
de la subconsulta están disponibles para la consulta externa, igual que las columnas de una tabla .
Las subconsultas se pueden usar para calcular agregaciones y otras expresiones. Todos los operadores SQL están disponibles en la subconsulta. Esto significa que una subconsulta puede contener otras subconsultas, realizar uniones y agrupaciones, etc.
Coma como UNION ALL
A diferencia de GoogleSQL, el SQL heredado usa la coma como operador UNION ALL
en lugar de CROSS JOIN
. Este comportamiento heredado evolucionó porque, históricamente, BigQuery no era compatible con CROSS JOIN
y sus usuarios necesitaban escribir consultas UNION ALL
con regularidad. En GoogleSQL, las consultas que realizan uniones son particularmente detalladas. Usar la coma como operador de unión permite escribir estas consultas de forma mucho más eficiente. Por ejemplo, esta consulta puede utilizarse para ejecutar una sola consulta sobre registros de varios días.
#legacySQL SELECT FORMAT_UTC_USEC(event.timestamp_in_usec) AS time, request_url FROM [applogs.events_20120501], [applogs.events_20120502], [applogs.events_20120503] WHERE event.username = 'root' AND NOT event.source_ip.is_internal;
Las consultas que unen un gran número de tablas suelen ser más lentas que las que procesan la misma cantidad de datos de una sola tabla. La diferencia de rendimiento puede ser de hasta 50 ms por cada tabla adicional. Una sola consulta puede unir un máximo de 1000 tablas.
Funciones comodín de tabla
El término "función comodín de tabla" se refiere a un tipo especial de función exclusivo de BigQuery. Estas funciones se utilizan en la cláusula FROM
para buscar coincidencias en un conjunto de nombres de tabla mediante uno de varios tipos de filtros. Por ejemplo, la función TABLE_DATE_RANGE
permite consultar únicamente un conjunto específico de tablas diarias. Para obtener más información sobre estas funciones, consulte "Funciones comodín de tabla" .
Operador FLATTEN
(FLATTEN([project_name:]datasetId.tableId, field_to_be_flattened)) (FLATTEN((subquery), field_to_be_flattened))
A diferencia de los sistemas de procesamiento SQL tradicionales, BigQuery está diseñado para gestionar datos repetidos. Por ello, los usuarios de BigQuery a veces necesitan escribir consultas que manipulen la estructura de registros repetidos. Una forma de hacerlo es mediante el operador FLATTEN
.
FLATTEN
convierte un nodo del esquema de repetido a opcional. Dado un registro con uno o más valores para un campo repetido, FLATTEN
creará varios registros, uno para cada valor del campo repetido. Todos los demás campos seleccionados del registro se duplican en cada nuevo registro de salida. FLATTEN
puede aplicarse repetidamente para eliminar múltiples niveles de repetición.
Para obtener más información y ejemplos, consulte Tratamiento de datos .
Operador JOIN
BigQuery admite varios operadores JOIN
en cada cláusula FROM
. Las operaciones JOIN
posteriores utilizan los resultados de la operación JOIN
anterior como entrada JOIN
izquierda. Los campos de cualquier entrada JOIN
anterior se pueden usar como claves en las cláusulas ON
de los operadores JOIN
posteriores.
Tipos de UNIÓN
BigQuery admite las operaciones INNER
, [FULL|RIGHT|LEFT] OUTER
y CROSS JOIN
. Si no se especifica, el valor predeterminado es INNER
.
Las operaciones CROSS JOIN
no admiten cláusulas ON
. CROSS JOIN
puede devolver una gran cantidad de datos y podría resultar en una consulta lenta e ineficiente o en una consulta que exceda el máximo de recursos permitidos por consulta. Estas consultas fallarán con un error. Siempre que sea posible, opte por consultas que no utilicen CROSS JOIN
. Por ejemplo, CROSS JOIN
se suele usar donde las funciones de ventana serían más eficientes.
CADA modificador
El modificador EACH
es una indicación que indica a BigQuery que ejecute la JOIN
usando múltiples particiones. Esto es especialmente útil cuando se sabe que ambos lados de la JOIN
son grandes. El modificador EACH
no se puede usar en cláusulas CROSS JOIN
.
Antes se recomendaba usar EACH
en muchos casos, pero ya no es así. Siempre que sea posible, use JOIN
sin el modificador EACH
para un mejor rendimiento. Use JOIN EACH
cuando su consulta falle con un mensaje de error de recursos excedidos.
Semi-unión y anti-unión
Además de admitir JOIN
en la cláusula FROM
, BigQuery también admite dos tipos de uniones en la cláusula WHERE
: semiunión y antisemiunión. Una semiunión se especifica mediante la palabra clave IN
con una subconsulta; la antiunión, mediante las palabras clave NOT IN
.
Ejemplos
La siguiente consulta utiliza una semiunión para encontrar ngramas donde la primera palabra del ngrama también es la segunda palabra de otro ngrama que tiene "AND" como la tercera palabra del ngrama.
#legacySQL SELECT ngram FROM [bigquery-public-data:samples.trigrams] WHERE first IN (SELECT second FROM [bigquery-public-data:samples.trigrams] WHERE third = "AND") LIMIT 10;
La siguiente consulta utiliza una semiunión para devolver el número de mujeres mayores de 50 años que dieron a luz en los 10 estados con más nacimientos.
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE state IN (SELECT state FROM (SELECT state, COUNT(state) total FROM [bigquery-public-data:samples.natality] GROUP BY state ORDER BY total DESC LIMIT 10)) AND mother_age > 50 GROUP BY mother_age ORDER BY mother_age DESC
Para ver las cifras de los otros 40 estados, puede usar una anti-unión. La siguiente consulta es casi idéntica al ejemplo anterior, pero usa NOT IN
en lugar de IN
para devolver el número de mujeres mayores de 50 años que dieron a luz en los 40 estados con menos nacimientos.
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE state NOT IN (SELECT state FROM (SELECT state, COUNT(state) total FROM [bigquery-public-data:samples.natality] GROUP BY state ORDER BY total DESC LIMIT 10)) AND mother_age > 50 GROUP BY mother_age ORDER BY mother_age DESC
Notas:
- BigQuery no admite uniones semi- ni anti-semi-uniones correlacionadas. La subconsulta no puede hacer referencia a ningún campo de la consulta externa.
- La subconsulta utilizada en una unión semi o anti-semi-unión debe seleccionar exactamente un campo.
- Los tipos del campo seleccionado y del campo utilizado en la consulta externa en la cláusula
WHERE
deben coincidir exactamente. BigQuery no realizará ninguna conversión de tipos para uniones semi o antisemi.
cláusula WHERE
La cláusula WHERE
, a veces denominada predicado, filtra los registros generados por la cláusula FROM
mediante una expresión booleana. Se pueden unir varias condiciones mediante cláusulas booleanas AND
y OR
, opcionalmente entre paréntesis ()) para agruparlas. No es necesario seleccionar los campos de una cláusula WHERE
en la cláusula SELECT
correspondiente, y la expresión de la cláusula WHERE
no puede hacer referencia a expresiones calculadas en la cláusula SELECT
de la consulta a la que pertenece WHERE
cláusula.
Nota: No se pueden usar funciones de agregación en la cláusula WHERE
. Utilice una cláusula HAVING
y una consulta externa si necesita filtrar la salida de una función de agregación.
Ejemplo
El siguiente ejemplo utiliza una disyunción de expresiones booleanas en la cláusula WHERE
(dos expresiones unidas mediante el operador OR
. Un registro de entrada pasará por el filtro WHERE
si alguna de las expresiones devuelve true
.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare] WHERE (word CONTAINS 'prais' AND word CONTAINS 'ing') OR (word CONTAINS 'laugh' AND word CONTAINS 'ed');
Cláusula OMIT RECORD IF
La cláusula OMIT RECORD IF
es una construcción exclusiva de BigQuery. Resulta especialmente útil para gestionar esquemas anidados y repetidos. Es similar a una cláusula WHERE
, pero se diferencia en dos aspectos importantes. En primer lugar, utiliza una condición de exclusión, lo que significa que los registros se omiten si la expresión devuelve true
, pero se conservan si la expresión devuelve false
o null
. En segundo lugar, la cláusula OMIT RECORD IF
puede (y suele hacerlo) utilizar funciones de agregación con alcance en su condición.
Además de filtrar registros completos, OMIT...IF
puede especificar un alcance más limitado para filtrar solo partes de un registro. Esto se logra usando el nombre de un nodo no hoja en el esquema, en lugar de RECORD
en la cláusula OMIT...IF
. Los usuarios de BigQuery rara vez usan esta funcionalidad. Puede encontrar más documentación sobre este comportamiento avanzado en el enlace a la documentación WITHIN
mencionada anteriormente.
Si usa OMIT...IF
para excluir una parte de un registro en un campo repetitivo y la consulta también selecciona otros campos que se repiten de forma independiente, BigQuery omite una parte de los demás registros repetidos en la consulta. Si ve el error Cannot perform OMIT IF on repeated scope <scope> with independently repeating pass through field <field>,
le recomendamos cambiar a GoogleSQL. Para obtener información sobre la migración de las instrucciones OMIT...IF
a GoogleSQL, consulte Migración a GoogleSQL .
Ejemplo
Volviendo al ejemplo utilizado para el modificador WITHIN
, OMIT RECORD IF
se puede utilizar para lograr lo mismo que se utilizaba WITHIN
y HAVING
en ese ejemplo.
#legacySQL SELECT repository.url FROM [bigquery-public-data:samples.github_nested] OMIT RECORD IF COUNT(payload.pages.page_name) <= 80;
Cláusula GROUP BY
La cláusula GROUP BY
permite agrupar filas con los mismos valores para un campo o conjunto de campos, lo que permite calcular agregaciones de campos relacionados. La agrupación se produce después del filtrado realizado en la cláusula WHERE
, pero antes de calcular las expresiones de la cláusula SELECT
. Los resultados de las expresiones no se pueden usar como claves de grupo en la cláusula GROUP BY
.
Ejemplo
Esta consulta encuentra las diez primeras palabras más comunes en el conjunto de datos de muestra de trigramas. Además de demostrar el uso de la cláusula GROUP BY
, muestra cómo se pueden usar índices posicionales en lugar de nombres de campo en las cláusulas GROUP BY
y ORDER BY
.
#legacySQL SELECT first, COUNT(ngram) FROM [bigquery-public-data:samples.trigrams] GROUP BY 1 ORDER BY 2 DESC LIMIT 10;
La agregación realizada mediante una cláusula GROUP BY
se denomina agregación agrupada . A diferencia de la agregación con alcance , la agregación agrupada es común en la mayoría de los sistemas de procesamiento de SQL.
El modificador EACH
El modificador EACH
es una indicación que indica a BigQuery que ejecute GROUP BY
usando múltiples particiones. Esto es especialmente útil cuando se sabe que el conjunto de datos contiene una gran cantidad de valores distintos para las claves de grupo.
Antes se recomendaba usar EACH
en muchos casos, pero ya no es así. Usar GROUP BY
sin el modificador EACH
suele ofrecer un mejor rendimiento. Use GROUP EACH BY
cuando su consulta falle con un mensaje de error de recursos excedidos.
La función ROLLUP
Al usar la función ROLLUP
, BigQuery agrega filas adicionales al resultado de la consulta que representan agregaciones acumuladas . Todos los campos enumerados después de ROLLUP
deben estar entre paréntesis. En las filas agregadas mediante la función ROLLUP
, NULL
indica las columnas para las que se acumula la agregación.
Ejemplo
Esta consulta genera recuentos anuales de nacimientos masculinos y femeninos a partir del conjunto de datos de natalidad de muestra.
#legacySQL SELECT year, is_male, COUNT(1) as count FROM [bigquery-public-data:samples.natality] WHERE year >= 2000 AND year <= 2002 GROUP BY ROLLUP(year, is_male) ORDER BY year, is_male;
Estos son los resultados de la consulta. Observe que hay filas donde una o ambas claves de grupo son NULL
. Estas filas son las filas de resumen .
+------+---------+----------+ | year | is_male | count | +------+---------+----------+ | NULL | NULL | 12122730 | | 2000 | NULL | 4063823 | | 2000 | false | 1984255 | | 2000 | true | 2079568 | | 2001 | NULL | 4031531 | | 2001 | false | 1970770 | | 2001 | true | 2060761 | | 2002 | NULL | 4027376 | | 2002 | false | 1966519 | | 2002 | true | 2060857 | +------+---------+----------+
Al utilizar la función ROLLUP
, puede utilizar la función GROUPING
para distinguir entre las filas que se agregaron debido a la función ROLLUP
y las filas que en realidad tienen un valor NULL
para la clave de grupo.
Ejemplo
Esta consulta agrega la función GROUPING
al ejemplo anterior para identificar mejor las filas agregadas debido a la función ROLLUP
.
#legacySQL SELECT year, GROUPING(year) as rollup_year, is_male, GROUPING(is_male) as rollup_gender, COUNT(1) as count FROM [bigquery-public-data:samples.natality] WHERE year >= 2000 AND year <= 2002 GROUP BY ROLLUP(year, is_male) ORDER BY year, is_male;
Estos son los resultados que devuelve la nueva consulta.
+------+-------------+---------+---------------+----------+ | year | rollup_year | is_male | rollup_gender | count | +------+-------------+---------+---------------+----------+ | NULL | 1 | NULL | 1 | 12122730 | | 2000 | 0 | NULL | 1 | 4063823 | | 2000 | 0 | false | 0 | 1984255 | | 2000 | 0 | true | 0 | 2079568 | | 2001 | 0 | NULL | 1 | 4031531 | | 2001 | 0 | false | 0 | 1970770 | | 2001 | 0 | true | 0 | 2060761 | | 2002 | 0 | NULL | 1 | 4027376 | | 2002 | 0 | false | 0 | 1966519 | | 2002 | 0 | true | 0 | 2060857 | +------+-------------+---------+---------------+----------+
Notas:
- Los campos no agregados en la cláusula
SELECT
deben estar incluidos en la cláusulaGROUP BY
.#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus; /* Succeeds because all non-aggregated fields are group keys. */
#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word; /* Fails because corpus is not aggregated nor is it a group key. */
- Las expresiones calculadas en la cláusula
SELECT
no se pueden utilizar en la cláusulaGROUP BY
correspondiente.#legacySQL SELECT word, corpus, COUNT(word) word_count FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus, word_count; /* Fails because word_count is not visible to this
GROUP BY
clause. */ - No se admite la agrupación por valores flotantes y dobles, porque la función de igualdad para esos tipos no está bien definida.
- Dado que el sistema es interactivo, las consultas que generan una gran cantidad de grupos podrían fallar. El uso de la función
TOP
en lugar deGROUP BY
podría solucionar algunos problemas de escalado.
Cláusula HAVING
La cláusula HAVING
se comporta exactamente igual que la cláusula WHERE
, salvo que se evalúa después de la cláusula SELECT
, por lo que los resultados de todas las expresiones calculadas son visibles para la cláusula HAVING
. La cláusula HAVING solo puede hacer referencia a las salidas de la cláusula SELECT
correspondiente.
Ejemplo
Esta consulta calcula las primeras palabras más comunes en el conjunto de datos de muestra de ngramas que contienen la letra a y aparecen como máximo 10 000 veces.
#legacySQL SELECT first, COUNT(ngram) ngram_count FROM [bigquery-public-data:samples.trigrams] GROUP BY 1 HAVING first contains "a" AND ngram_count < 10000 ORDER BY 2 DESC LIMIT 10;
Cláusula ORDER BY
La cláusula ORDER BY
ordena los resultados de una consulta en orden ascendente o descendente utilizando uno o más campos clave. Para ordenar por varios campos o alias, introdúzcalos como una lista separada por comas. Los resultados se ordenan por los campos en el orden en que aparecen. Utilice DESC
(descendente) o ASC
(ascendente) para especificar la dirección de ordenación. ASC
es el valor predeterminado. Se puede especificar una dirección de ordenación diferente para cada clave de ordenación.
La cláusula ORDER BY
se evalúa después de la cláusula SELECT
, por lo que puede referenciar la salida de cualquier expresión calculada en SELECT
. Si se asigna un alias a un campo en la cláusula SELECT
, este debe usarse en la cláusula ORDER BY
.
cláusula LIMIT
La cláusula LIMIT
limita el número de filas en el conjunto de resultados devuelto. Dado que las consultas de BigQuery suelen operar sobre un gran número de filas, LIMIT
es una buena manera de evitar consultas de larga duración al procesar solo un subconjunto de las filas.
Notas:
- La cláusula
LIMIT
detendrá el procesamiento y devolverá los resultados cuando cumpla con sus requisitos. Esto puede reducir el tiempo de procesamiento de algunas consultas, pero al especificar funciones de agregación como las cláusulas COUNT uORDER BY
, se debe procesar todo el conjunto de resultados antes de devolver los resultados. La cláusulaLIMIT
es la última en evaluarse. - Una consulta con una cláusula
LIMIT
puede seguir siendo no determinista si no hay ningún operador que garantice el orden del conjunto de resultados. Esto se debe a que BigQuery se ejecuta con una gran cantidad de trabajadores paralelos. El orden de retorno de los trabajos paralelos no está garantizado. - La cláusula
LIMIT
no puede contener ninguna función; solo acepta una constante numérica. - Cuando se utiliza la cláusula
LIMIT
, el total de bytes procesados y los bytes facturados pueden variar para la misma consulta.
Gramática de consultas
Las cláusulas individuales de las sentencias SELECT
de BigQuery se describen en detalle más arriba . Aquí presentamos la gramática completa de las sentencias SELECT
de forma resumida, con enlaces a las secciones individuales.
query: SELECT { * | field_path.* | expression } [ [ AS ] alias ] [ , ... ] [ FROM from_body [ WHERE bool_expression ] [ OMIT RECORD IF bool_expression] [ GROUP [ EACH ] BY [ ROLLUP ] { field_name_or_alias } [ , ... ] ] [ HAVING bool_expression ] [ ORDER BY field_name_or_alias [ { DESC | ASC } ] [, ... ] ] [ LIMIT n ] ]; from_body: { from_item [, ...] | # Warning: Comma means UNION ALL here from_item [ join_type ] JOIN [ EACH ] from_item [ ON join_predicate ] | (FLATTEN({ table_name | (query) }, field_name_or_alias)) | table_wildcard_function } from_item: { table_name | (query) } [ [ AS ] alias ] join_type: { INNER | [ FULL ] [ OUTER ] | RIGHT [ OUTER ] | LEFT [ OUTER ] | CROSS } join_predicate: field_from_one_side_of_the_join = field_from_the_other_side_of_the_join [ AND ...] expression: { literal_value | field_name_or_alias | function_call } bool_expression: { expression_which_results_in_a_boolean_value | bool_expression AND bool_expression | bool_expression OR bool_expression | NOT bool_expression }
Notación:
- Los corchetes "[ ]" indican cláusulas opcionales.
- Las llaves "{ }" encierran un conjunto de opciones.
- La barra vertical "|" indica un OR lógico.
- Una coma o palabra clave seguida de puntos suspensivos dentro de corchetes "[, ... ]" indica que el elemento anterior puede repetirse en una lista con el separador especificado.
- Los paréntesis "()" indican paréntesis literales.
Funciones y operadores compatibles
La mayoría de las cláusulas SELECT
admiten funciones. Los campos referenciados en una función no necesitan estar incluidos en ninguna cláusula SELECT
. Por lo tanto, la siguiente consulta es válida, aunque el campo clicks
no se muestre directamente:
#legacySQL SELECT country, SUM(clicks) FROM table GROUP BY country;
Funciones agregadas | |
---|---|
AVG() | Devuelve el promedio de los valores de un grupo de filas... |
BIT_AND() | Devuelve el resultado de una operación AND bit a bit. |
BIT_OR() | Devuelve el resultado de una operación OR bit a bit. |
BIT_XOR() | Devuelve el resultado de una operación XOR bit a bit. |
CORR() | Devuelve el coeficiente de correlación de Pearson de un conjunto de pares de números. |
COUNT() | Devuelve el número total de valores... |
COUNT([DISTINCT]) | Devuelve el número total de valores distintos de NULL... |
COVAR_POP() | Calcula la covarianza poblacional de los valores... |
COVAR_SAMP() | Calcula la covarianza muestral de los valores... |
EXACT_COUNT_DISTINCT() | Devuelve el número exacto de valores distintos y no nulos para el campo especificado. |
FIRST() | Devuelve el primer valor secuencial en el ámbito de la función. |
GROUP_CONCAT() | Concatena múltiples cadenas en una sola cadena... |
GROUP_CONCAT_UNQUOTED() | Concatena varias cadenas en una sola cadena... no agregará comillas dobles... |
LAST() | Devuelve el último valor secuencial ... |
MAX() | Devuelve el valor máximo ... |
MIN() | Devuelve el valor mínimo... |
NEST() | Agrega todos los valores en el ámbito de agregación actual en un campo repetido. |
NTH() | Devuelve el n-ésimo valor secuencial ... |
QUANTILES() | Calcula valores mínimos, máximos y cuantiles aproximados... |
STDDEV() | Devuelve la desviación estándar... |
STDDEV_POP() | Calcula la desviación estándar de la población... |
STDDEV_SAMP() | Calcula la desviación estándar de la muestra... |
SUM() | Devuelve la suma total de los valores... |
TOP() ... COUNT(*) | Devuelve los registros max_records superiores por frecuencia. |
UNIQUE() | Devuelve el conjunto de valores únicos, no NULL... |
VARIANCE() | Calcula la varianza de los valores... |
VAR_POP() | Calcula la varianza poblacional de los valores... |
VAR_SAMP() | Calcula la varianza muestral de los valores... |
Operadores aritméticos | |
---|---|
+ | Suma |
- | Sustracción |
* | Multiplicación |
/ | División |
% | Módulo |
Funciones bit a bit | |
---|---|
& | AND bit a bit |
| | OR bit a bit |
^ | XOR bit a bit |
<< | Desplazamiento bit a bit a la izquierda |
>> | Desplazamiento bit a bit a la derecha |
~ | Bit a bit NO |
BIT_COUNT() | Devuelve el número de bits ... |
Funciones de casting | |
---|---|
BOOLEAN() | Convertir a booleano. |
BYTES() | Convertido a bytes. |
CAST(expr AS type) | Convierte expr en una variable de tipo type . |
FLOAT() | Emitir al doble. |
HEX_STRING() | Convertir a cadena hexadecimal. |
INTEGER() | Convertir a entero. |
STRING() | Emitir a cadena. |
Funciones de comparación | |
---|---|
expr1 = expr2 | Devuelve true si las expresiones son iguales. |
expr1 != expr2 expr1 <> expr2 | Devuelve true si las expresiones no son iguales. |
expr1 > expr2 | Devuelve true si expr1 es mayor que expr2 . |
expr1 < expr2 | Devuelve true si expr1 es menor que expr2 . |
expr1 >= expr2 | Devuelve true si expr1 es mayor o igual que expr2 . |
expr1 <= expr2 | Devuelve true si expr1 es menor o igual que expr2 . |
expr1 BETWEEN expr2 AND expr3 | Devuelve true si el valor de expr1 está entre expr2 y expr3 , inclusive. |
expr IS NULL | Devuelve true si expr es NULL. |
expr IN() | Devuelve true si expr coincide expr1 , expr2 o cualquier valor entre paréntesis. |
COALESCE() | Devuelve el primer argumento que no es NULL. |
GREATEST() | Devuelve el parámetro numeric_expr más grande. |
IFNULL() | Si el argumento no es nulo, devuelve el argumento. |
IS_INF() | Devuelve true si es infinito positivo o negativo. |
IS_NAN() | Devuelve true si el argumento es NaN . |
IS_EXPLICITLY_DEFINED() | obsoleto: utilice expr IS NOT NULL en su lugar. |
LEAST() | Devuelve el parámetro numeric_expr con el argumento más pequeño. |
NVL() | Si expr no es nulo, devuelve expr , de lo contrario, devuelve null_default . |
Funciones de fecha y hora | |
---|---|
CURRENT_DATE() | Devuelve la fecha actual en el formato %Y-%m-%d . |
CURRENT_TIME() | Devuelve la hora actual del servidor en el formato %H:%M:%S . |
CURRENT_TIMESTAMP() | Devuelve la hora actual del servidor en el formato %Y-%m-%d %H:%M:%S . |
DATE() | Devuelve la fecha en el formato %Y-%m-%d . |
DATE_ADD() | Agrega el intervalo especificado a un tipo de datos TIMESTAMP. |
DATEDIFF() | Devuelve el número de días entre dos tipos de datos TIMESTAMP. |
DAY() | Devuelve el día del mes como un entero entre 1 y 31. |
DAYOFWEEK() | Devuelve el día de la semana como un entero entre 1 (domingo) y 7 (sábado). |
DAYOFYEAR() | Devuelve el día del año como un entero entre 1 y 366. |
FORMAT_UTC_USEC() | Devuelve una marca de tiempo UNIX en el formato YYYY-MM-DD HH:MM:SS.uuuuuu . |
HOUR() | Devuelve la hora de un TIMESTAMP como un entero entre 0 y 23. |
MINUTE() | Devuelve los minutos de un TIMESTAMP como un entero entre 0 y 59. |
MONTH() | Devuelve el mes de un TIMESTAMP como un entero entre 1 y 12. |
MSEC_TO_TIMESTAMP() | Convierte una marca de tiempo UNIX en milisegundos en una TIMESTAMP. |
NOW() | Devuelve la marca de tiempo UNIX actual en microsegundos. |
PARSE_UTC_USEC() | Convierte una cadena de fecha en una marca de tiempo UNIX en microsegundos. |
QUARTER() | Devuelve el trimestre del año de un TIMESTAMP como un entero entre 1 y 4. |
SEC_TO_TIMESTAMP() | Convierte una marca de tiempo UNIX en segundos en una TIMESTAMP. |
SECOND() | Devuelve los segundos de un TIMESTAMP como un entero entre 0 y 59. |
STRFTIME_UTC_USEC() | Devuelve una cadena de fecha en el formato date_format_str . |
TIME() | Devuelve un TIMESTAMP en el formato %H:%M:%S . |
TIMESTAMP() | Convierte una cadena de fecha en una TIMESTAMP. |
TIMESTAMP_TO_MSEC() | Convierte una TIMESTAMP en una marca de tiempo UNIX en milisegundos. |
TIMESTAMP_TO_SEC() | Convierte una TIMESTAMP en una marca de tiempo UNIX en segundos. |
TIMESTAMP_TO_USEC() | Convierte una TIMESTAMP en una marca de tiempo UNIX en microsegundos. |
USEC_TO_TIMESTAMP() | Convierte una marca de tiempo UNIX en microsegundos en una TIMESTAMP. |
UTC_USEC_TO_DAY() | Desplaza una marca de tiempo UNIX en microsegundos al comienzo del día en el que ocurre. |
UTC_USEC_TO_HOUR() | Desplaza una marca de tiempo UNIX en microsegundos al comienzo de la hora en la que ocurre. |
UTC_USEC_TO_MONTH() | Desplaza una marca de tiempo UNIX en microsegundos al comienzo del mes en el que ocurre. |
UTC_USEC_TO_WEEK() | Devuelve una marca de tiempo UNIX en microsegundos que representa un día de la semana. |
UTC_USEC_TO_YEAR() | Devuelve una marca de tiempo UNIX en microsegundos que representa el año. |
WEEK() | Devuelve la semana de un TIMESTAMP como un entero entre 1 y 53. |
YEAR() | Devuelve el año de un TIMESTAMP. |
Funciones de IP | |
---|---|
FORMAT_IP() | Convierte los 32 bits menos significativos de integer_value en una cadena de dirección IPv4 legible por humanos. |
PARSE_IP() | Convierte una cadena que representa una dirección IPv4 en un valor entero sin signo. |
FORMAT_PACKED_IP() | Devuelve una dirección IP legible por humanos con el formato 10.1.5.23 o 2620:0:1009:1:216:36ff:feef:3f . |
PARSE_PACKED_IP() | Devuelve una dirección IP en BYTES . |
Funciones JSON | |
---|---|
JSON_EXTRACT() | Selecciona un valor según la expresión JSONPath y devuelve una cadena JSON. |
JSON_EXTRACT_SCALAR() | Selecciona un valor según la expresión JSONPath y devuelve un escalar JSON. |
Operadores lógicos | |
---|---|
expr AND expr | Devuelve true si ambas expresiones son verdaderas. |
expr OR expr | Devuelve true si una o ambas expresiones son verdaderas. |
NOT expr | Devuelve true si la expresión es falsa. |
Funciones matemáticas | |
---|---|
ABS() | Devuelve el valor absoluto del argumento. |
ACOS() | Devuelve el arco coseno del argumento. |
ACOSH() | Devuelve el arcocoseno hiperbólico del argumento. |
ASIN() | Devuelve el arcoseno del argumento. |
ASINH() | Devuelve el arcoseno hiperbólico del argumento. |
ATAN() | Devuelve el arco tangente del argumento. |
ATANH() | Devuelve la tangente hiperbólica del arco del argumento. |
ATAN2() | Devuelve el arco tangente de los dos argumentos. |
CEIL() | Redondea el argumento al número entero más cercano y devuelve el valor redondeado. |
COS() | Devuelve el coseno del argumento. |
COSH() | Devuelve el coseno hiperbólico del argumento. |
DEGREES() | Convierte de radianes a grados. |
EXP() | Devuelve e elevado a la potencia del argumento. |
FLOOR() | Redondea el argumento hasta el número entero más cercano. |
LN() LOG() | Devuelve el logaritmo natural del argumento. |
LOG2() | Devuelve el logaritmo en base 2 del argumento. |
LOG10() | Devuelve el logaritmo en base 10 del argumento. |
PI() | Devuelve la constante π. |
POW() | Devuelve el primer argumento elevado a la potencia del segundo argumento. |
RADIANS() | Convierte de grados a radianes. |
RAND() | Devuelve un valor flotante aleatorio en el rango 0,0 <= valor < 1,0. |
ROUND() | Redondea el argumento hacia arriba o hacia abajo hasta el número entero más cercano. |
SIN() | Devuelve el seno del argumento. |
SINH() | Devuelve el seno hiperbólico del argumento. |
SQRT() | Devuelve la raíz cuadrada de la expresión. |
TAN() | Devuelve la tangente del argumento. |
TANH() | Devuelve la tangente hiperbólica del argumento. |
Funciones de expresión regular | |
---|---|
REGEXP_MATCH() | Devuelve verdadero si el argumento coincide con la expresión regular. |
REGEXP_EXTRACT() | Devuelve la parte del argumento que coincide con el grupo de captura dentro de la expresión regular. |
REGEXP_REPLACE() | Reemplaza una subcadena que coincide con una expresión regular. |
Funciones de cadena | |
---|---|
CONCAT() | Devuelve la concatenación de dos o más cadenas, o NULL si alguno de los valores es NULL. |
expr CONTAINS ' str ' | Devuelve true si expr contiene el argumento de cadena especificado. |
INSTR() | Devuelve el índice basado en uno de la primera aparición de una cadena. |
LEFT() | Devuelve los caracteres más a la izquierda de una cadena. |
LENGTH() | Devuelve la longitud de la cadena. |
LOWER() | Devuelve la cadena original con todos los caracteres en minúsculas. |
LPAD() | Inserta caracteres a la izquierda de una cadena. |
LTRIM() | Elimina caracteres del lado izquierdo de una cadena. |
REPLACE() | Reemplaza todas las apariciones de una subcadena. |
RIGHT() | Devuelve los caracteres más a la derecha de una cadena. |
RPAD() | Inserta caracteres en el lado derecho de una cadena. |
RTRIM() | Elimina los caracteres finales del lado derecho de una cadena. |
SPLIT() | Divide una cadena en subcadenas repetidas. |
SUBSTR() | Devuelve una subcadena ... |
UPPER() | Devuelve la cadena original con todos los caracteres en mayúsculas. |
Funciones comodín de tabla | |
---|---|
TABLE_DATE_RANGE() | Consulta varias tablas diarias que abarcan un rango de fechas. |
TABLE_DATE_RANGE_STRICT() | Consulta varias tablas diarias que abarcan un rango de fechas, sin fechas faltantes. |
TABLE_QUERY() | Consulta tablas cuyos nombres coinciden con un predicado especificado. |
Funciones de URL | |
---|---|
HOST() | Dada una URL, devuelve el nombre del host como una cadena. |
DOMAIN() | Dada una URL, devuelve el dominio como una cadena. |
TLD() | Dada una URL, devuelve el dominio de nivel superior más cualquier dominio de país en la URL. |
Funciones de ventana | |
---|---|
AVG() COUNT(*) COUNT([DISTINCT]) MAX() MIN() STDDEV() SUM() | La misma operación que las funciones de agregación correspondientes, pero se calculan en una ventana definida por la cláusula OVER. |
CUME_DIST() | Devuelve un doble que indica la distribución acumulativa de un valor en un grupo de valores... |
DENSE_RANK() | Devuelve el rango entero de un valor en un grupo de valores. |
FIRST_VALUE() | Devuelve el primer valor del campo especificado en la ventana. |
LAG() | Le permite leer datos de una fila anterior dentro de una ventana. |
LAST_VALUE() | Devuelve el último valor del campo especificado en la ventana. |
LEAD() | Le permite leer datos de una fila siguiente dentro de una ventana. |
NTH_VALUE() | Devuelve el valor de <expr> en la posición <n> del marco de la ventana... |
NTILE() | Divide la ventana en el número especificado de segmentos. |
PERCENT_RANK() | Devuelve el rango de la fila actual, en relación con las otras filas de la partición. |
PERCENTILE_CONT() | Devuelve un valor interpolado que se asignaría al argumento de percentil con respecto a la ventana... |
PERCENTILE_DISC() | Devuelve el valor más cercano al percentil del argumento sobre la ventana. |
RANK() | Devuelve el rango entero de un valor en un grupo de valores. |
RATIO_TO_REPORT() | Devuelve la relación entre cada valor y la suma de los valores. |
ROW_NUMBER() | Devuelve el número de fila actual del resultado de la consulta en la ventana. |
Otras funciones | |
---|---|
CASE WHEN ... THEN | Utilice CASE para elegir entre dos o más expresiones alternativas en su consulta. |
CURRENT_USER() | Devuelve la dirección de correo electrónico del usuario que ejecuta la consulta. |
EVERY() | Devuelve verdadero si el argumento es verdadero para todas sus entradas. |
FROM_BASE64() | Convierte la cadena de entrada codificada en base 64 al formato BYTES. |
HASH() | Calcula y devuelve un valor hash con signo de 64 bits... |
FARM_FINGERPRINT() | Calcula y devuelve un valor de huella digital firmada de 64 bits... |
IF() | Si el primer argumento es verdadero, devuelve el segundo argumento; de lo contrario, devuelve el tercer argumento. |
POSITION() | Devuelve la posición secuencial basada en uno del argumento. |
SHA1() | Devuelve un hash SHA1 , en formato BYTES. |
SOME() | Devuelve verdadero si el argumento es verdadero para al menos una de sus entradas. |
TO_BASE64() | Convierte el argumento BYTES en una cadena codificada en base 64. |
Funciones agregadas
Las funciones de agregación devuelven valores que representan resúmenes de conjuntos de datos más grandes, lo que las hace especialmente útiles para analizar registros. Una función de agregación opera sobre una colección de valores y devuelve un único valor por tabla, grupo o ámbito:
- Agregación de tablas
Utiliza una función de agregación para resumir todas las filas que cumplen los requisitos de la tabla. Por ejemplo:
SELECT COUNT(f1) FROM ds.Table;
- Agregación de grupos
Utiliza una función de agregación y una cláusula
GROUP BY
que especifica un campo no agregado para resumir las filas por grupo. Por ejemplo:SELECT COUNT(f1) FROM ds.Table GROUP BY b1;
La función TOP representa un caso especializado de agregación de grupos.
- Agregación con alcance
Esta característica se aplica únicamente a tablas que tienen campos anidados .
Utiliza una función de agregación y la palabra claveWITHIN
para agregar valores repetidos dentro de un ámbito definido. Por ejemplo:SELECT COUNT(m1.f2) WITHIN RECORD FROM Table;
El alcance puede ser
RECORD
, que corresponde a una fila completa, o un nodo (campo repetido en una fila). Las funciones de agregación operan sobre los valores dentro del alcance y devuelven resultados agregados para cada registro o nodo.
Puede aplicar una restricción a una función de agregación utilizando una de las siguientes opciones:
Un alias en una consulta de subselección. La restricción se especifica en la cláusula
WHERE
externa.#legacySQL SELECT corpus, count_corpus_words FROM (SELECT corpus, count(word) AS count_corpus_words FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus) AS sub_shakespeare WHERE count_corpus_words > 4000
Un alias en una cláusula HAVING .
#legacySQL SELECT corpus, count(word) AS count_corpus_words FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus HAVING count_corpus_words > 4000;
También puedes hacer referencia a un alias en las cláusulas GROUP BY
o ORDER BY
.
Sintaxis
Funciones agregadas | |
---|---|
AVG() | Devuelve el promedio de los valores de un grupo de filas... |
BIT_AND() | Devuelve el resultado de una operación AND bit a bit. |
BIT_OR() | Devuelve el resultado de una operación OR bit a bit. |
BIT_XOR() | Devuelve el resultado de una operación XOR bit a bit. |
CORR() | Devuelve el coeficiente de correlación de Pearson de un conjunto de pares de números. |
COUNT() | Devuelve el número total de valores... |
COUNT([DISTINCT]) | Devuelve el número total de valores distintos de NULL... |
COVAR_POP() | Calcula la covarianza poblacional de los valores... |
COVAR_SAMP() | Calcula la covarianza muestral de los valores... |
EXACT_COUNT_DISTINCT() | Devuelve el número exacto de valores distintos y no nulos para el campo especificado. |
FIRST() | Devuelve el primer valor secuencial en el ámbito de la función. |
GROUP_CONCAT() | Concatena múltiples cadenas en una sola cadena... |
GROUP_CONCAT_UNQUOTED() | Concatena varias cadenas en una sola cadena... no agregará comillas dobles... |
LAST() | Devuelve el último valor secuencial ... |
MAX() | Devuelve el valor máximo ... |
MIN() | Devuelve el valor mínimo... |
NEST() | Agrega todos los valores en el ámbito de agregación actual en un campo repetido. |
NTH() | Devuelve el n-ésimo valor secuencial ... |
QUANTILES() | Calcula valores mínimos, máximos y cuantiles aproximados... |
STDDEV() | Devuelve la desviación estándar... |
STDDEV_POP() | Calcula la desviación estándar de la población... |
STDDEV_SAMP() | Calcula la desviación estándar de la muestra... |
SUM() | Devuelve la suma total de los valores... |
TOP() ... COUNT(*) | Devuelve los registros max_records superiores por frecuencia. |
UNIQUE() | Devuelve el conjunto de valores únicos, no NULL... |
VARIANCE() | Calcula la varianza de los valores... |
VAR_POP() | Calcula la varianza poblacional de los valores... |
VAR_SAMP() | Calcula la varianza muestral de los valores... |
-
AVG( numeric_expr )
- Devuelve el promedio de los valores de un grupo de filas calculado por
numeric_expr
. Las filas con un valor nulo no se incluyen en el cálculo. -
BIT_AND( numeric_expr )
- Devuelve el resultado de una operación
AND
bit a bit entre cada instancia denumeric_expr
en todas las filas. Se ignoran los valoresNULL
. Esta función devuelveNULL
si todas las instancias denumeric_expr
se evalúan comoNULL
. -
BIT_OR( numeric_expr )
- Devuelve el resultado de una operación
OR
bit a bit entre cada instancia denumeric_expr
en todas las filas. Se ignoran los valoresNULL
. Esta función devuelveNULL
si todas las instancias denumeric_expr
se evalúan comoNULL
. -
BIT_XOR( numeric_expr )
- Devuelve el resultado de una operación
XOR
bit a bit entre cada instancia denumeric_expr
en todas las filas. Los valoresNULL
se ignoran. Esta función devuelveNULL
si todas las instancias denumeric_expr
se evalúan comoNULL
. -
CORR( numeric_expr , numeric_expr )
- Devuelve el coeficiente de correlación de Pearson de un conjunto de pares de números.
-
COUNT(*)
- Devuelve el número total de valores (NULL y no NULL) dentro del alcance de la función. A menos que utilice
COUNT(*)
con la funciónTOP
, es mejor especificar explícitamente el campo que se va a contar. -
COUNT([DISTINCT] field [, n ])
- Devuelve el número total de valores distintos de NULL en el ámbito de la función.
Si utiliza la palabra clave
DISTINCT
, la función devuelve el número de valores distintos para el campo especificado. Tenga en cuenta que el valor devuelto porDISTINCT
es una aproximación estadística y no se garantiza su exactitud.Utilice
EXACT_COUNT_DISTINCT()
para obtener una respuesta exacta.Si necesita una mayor precisión del
, puede especificar un segundo parámetro,COUNT(DISTINCT)
n
, que da el umbral por debajo del cual se garantizan los resultados exactos. Por defecto,n
es 1000, pero si da unan
más grande, obtendrá resultados exactos paraCOUNT(DISTINCT)
hasta ese valor den
. Sin embargo, dar valores más grandes den
reducirá la escalabilidad de este operador y puede aumentar sustancialmente el tiempo de ejecución de la consulta o hacer que la consulta falle.Para calcular el número exacto de valores distintos, use Exact_Count_Distast . O, para un enfoque más escalable, considere usar
GROUP EACH BY
en los campos relevantes y luego aplicarCOUNT(*)
. ElGROUP EACH BY
enfoque es más escalable, pero puede incurrir en una ligera penalización por rendimiento por adelantado. -
COVAR_POP( numeric_expr1 , numeric_expr2 )
- Calcula la covarianza de la población de los valores calculados por
numeric_expr1
ynumeric_expr2
. -
COVAR_SAMP( numeric_expr1 , numeric_expr2 )
- Calcula la covarianza de muestra de los valores calculados por
numeric_expr1
ynumeric_expr2
. -
EXACT_COUNT_DISTINCT( field )
- Devuelve el número exacto de valores distintos no nulos para el campo especificado. Para una mejor escalabilidad y rendimiento, use recuento ( campo distinto) .
-
FIRST( expr )
- Devuelve el primer valor secuencial en el alcance de la función.
-
GROUP_CONCAT( 'str' [, separator ])
Concatena múltiples cadenas en una sola cadena, donde cada valor está separado por el parámetro
separator
opcional. Si se omiteseparator
, BigQuery devuelve una cadena separada por comas.Si una cadena en los datos de origen contiene un carácter de doble cita,
GROUP_CONCAT
devuelve la cadena con cotizaciones dobles agregadas. Por ejemplo, la cadenaa"b
regresaría como"a""b"
. UseGROUP_CONCAT_UNQUOTED
si prefiere que estas cadenas no regresen con cotizaciones dobles agregadas.Ejemplo:
#legacySQL SELECT GROUP_CONCAT(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
-
GROUP_CONCAT_UNQUOTED( 'str' [, separator ])
Concatena múltiples cadenas en una sola cadena, donde cada valor está separado por el parámetro
separator
opcional. Si se omiteseparator
, BigQuery devuelve una cadena separada por comas.A diferencia de
GROUP_CONCAT
, esta función no agregará cotizaciones dobles a los valores devueltos que incluyen un carácter de doble cita. Por ejemplo, la cadenaa"b
regresaría comoa"b
Ejemplo:
#legacySQL SELECT GROUP_CONCAT_UNQUOTED(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
-
LAST( field )
- Devuelve el último valor secuencial en el alcance de la función.
-
MAX( field )
- Devuelve el valor máximo en el alcance de la función.
-
MIN( field )
- Devuelve el valor mínimo en el alcance de la función.
-
NEST( expr )
Agregue todos los valores en el alcance de agregación actual en un campo repetido. Por ejemplo, la consulta
"SELECT x, NEST(y) FROM ... GROUP BY x"
Devuelve un registro de salida para cada valorx
distintivo, y contiene un campo repetido para todos los valoresy
combinados conx
en la entrada de consulta. La funciónNEST
requiere unGROUP BY
cláusula.BigQuery aplana automáticamente los resultados de la consulta, por lo que si usa la función
NEST
en la consulta de nivel superior, los resultados no contienen campos repetidos. Use la funciónNEST
cuando se use una subselección que produce resultados intermedios para el uso inmediato por la misma consulta.-
NTH( n , field )
- Devuelve el valor secuencial
n
en el alcance de la función, donden
es una constante. LaNTH
función comienza a contar en 1, por lo que no hay un término Zeroth. Si el alcance de la función tiene menos den
valores, la función devuelveNULL
. -
QUANTILES( expr [, buckets ])
Calcula el mínimo, máximo y cuantiles aproximados para la expresión de entrada. Se ignoran los valores de entrada
NULL
. La entrada vacía o exclusivamenteNULL
da como resultado una salidaNULL
. El número de cuantiles calculados se controla con el parámetrobuckets
opcional, que incluye el mínimo y el máximo en el recuento. Para calcular los fichas N aproximadas, usebuckets
N+1. El valor predeterminado debuckets
es 100. (Nota: El valor predeterminado de 100 no estimula los percentiles. Para estimar los percentiles, use 101buckets
como mínimo). Si se especifica explícitamente,buckets
deben ser al menos 2.El error fraccional por cuantil es Epsilon = 1 /
buckets
, lo que significa que el error disminuye a medida que aumenta el número de cubos. Por ejemplo:QUANTILES(<expr>, 2) # computes min and max with 50% error. QUANTILES(<expr>, 3) # computes min, median, and max with 33% error. QUANTILES(<expr>, 5) # computes quartiles with 25% error. QUANTILES(<expr>, 11) # computes deciles with 10% error. QUANTILES(<expr>, 21) # computes vigintiles with 5% error. QUANTILES(<expr>, 101) # computes percentiles with 1% error.
La
NTH
función se puede usar para elegir un cuantil en particular, pero recuerde queNTH
está basado en 1, y queQUANTILES
devuelven el mínimo ("0 °" cuantil) en la primera posición, y el máximo (percentil "100 °" o "nth" n-filo) en la última posición. Por ejemplo,NTH(11, QUANTILES(expr, 21))
estima la mediana deexpr
, mientras queNTH(20, QUANTILES(expr, 21))
estima el 19º Vigintil (percentil 95) deexpr
. Ambas estimaciones tienen un margen de error del 5%.Para mejorar la precisión, use más cubos. Por ejemplo, para reducir el margen de error para los cálculos anteriores del 5% al 0.1%, use 1001 cubos en lugar de 21, y ajuste el argumento a la
NTH
función en consecuencia. Para calcular la mediana con un error del 0.1%, useNTH(501, QUANTILES(expr, 1001))
; Para el percentil 95 con un error del 0.1%, useNTH(951, QUANTILES(expr, 1001))
.-
STDDEV( numeric_expr )
- Devuelve la desviación estándar de los valores calculados por
numeric_expr
. Las filas con un valor nulo no están incluidas en el cálculo. La funciónSTDDEV
es un alias paraSTDDEV_SAMP
. -
STDDEV_POP( numeric_expr )
- Calcula la desviación estándar de la población del valor calculado por
numeric_expr
. UseSTDDEV_POP()
para calcular la desviación estándar de un conjunto de datos que abarca toda la población de interés. Si su conjunto de datos comprende solo una muestra representativa de la población, useSTDDEV_SAMP()
en su lugar. Para obtener más información sobre la población versus la desviación estándar de la muestra, consulte la desviación estándar sobre Wikipedia . -
STDDEV_SAMP( numeric_expr )
- Calcula la muestra estándar de desviación del valor calculado por
numeric_expr
. UseSTDDEV_SAMP()
para calcular la desviación estándar de una población completa basada en una muestra representativa de la población. Si su conjunto de datos comprende toda la población, useSTDDEV_POP()
en su lugar. Para obtener más información sobre la población versus la desviación estándar de la muestra, consulte la desviación estándar sobre Wikipedia . -
SUM( field )
- Devuelve la suma total de los valores en el alcance de la función. Para usar solo con tipos de datos numéricos.
-
TOP( field | alias [, max_values ][, multiplier ]) ... COUNT(*)
- Devuelve los registros Top Max_records por frecuencia. Consulte la descripción superior a continuación para más detalles.
-
UNIQUE( expr )
- Devuelve el conjunto de valores únicos y no nulos en el alcance de la función en un orden indefinido. Similar a un
GROUP BY
cláusula sinEACH
palabra clave, la consulta fallará con un error de "recursos excedidos" si hay demasiados valores distintos. Sin embargo, a diferenciaGROUP BY
, la funciónUNIQUE
se puede aplicar con agregación alcanzada, lo que permite una operación eficiente en campos anidados con un número limitado de valores. -
VARIANCE( numeric_expr )
- Calcula la varianza de los valores calculados por
numeric_expr
. Las filas con un valor nulo no están incluidas en el cálculo. La funciónVARIANCE
es un alias paraVAR_SAMP
. -
VAR_POP( numeric_expr )
- Calcula la varianza de población de los valores calculados por
numeric_expr
. Para obtener más información sobre la población versus la desviación estándar de la muestra, consulte la desviación estándar sobre Wikipedia . -
VAR_SAMP( numeric_expr )
- Calcula la varianza de muestra de los valores calculados por
numeric_expr
. Para obtener más información sobre la población versus la desviación estándar de la muestra, consulte la desviación estándar sobre Wikipedia .
Función top ()
TOP es una función que es una alternativa al grupo por cláusula. Se usa como sintaxis simplificada para GROUP BY ... ORDER BY ... LIMIT ...
En general, la función superior funciona más rápido que el ... GROUP BY ... ORDER BY ... LIMIT ...
consulta, pero solo puede devolver resultados aproximados. La siguiente es la sintaxis para la función superior:
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
Al usar la parte superior en una cláusula SELECT
, debe incluir COUNT(*)
como uno de los campos.
Una consulta que usa la función superior () puede devolver solo dos campos: el campo superior y el valor de recuento (*).
-
field | alias
- El campo o alias para regresar.
-
max_values
- [ Opcional ] El número máximo de resultados para devolver. El valor predeterminado es 20.
-
multiplier
- Un entero positivo que aumenta el valor (s) devuelto por
COUNT(*)
por el múltiplo especificado.
Ejemplos de TOP()
Consultas de ejemplo básicas que usan
TOP()
Las siguientes consultas usan
TOP()
para devolver 10 filas.Ejemplo 1:
#legacySQL SELECT TOP(word, 10) as word, COUNT(*) as cnt FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th";
Ejemplo 2:
#legacySQL SELECT word, left(word, 3) FROM (SELECT TOP(word, 10) AS word, COUNT(*) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th");
Compare
TOP()
conGROUP BY...ORDER BY...LIMIT
La consulta devuelve, en orden, las 10 palabras más utilizadas con más frecuencia que contienen "th", y el número de documentos en los que se usaron las palabras. La consulta
TOP
se ejecutará mucho más rápido:Ejemplo sin
TOP()
:#legacySQL SELECT word, COUNT(*) AS cnt FROM ds.Table WHERE word CONTAINS 'th' GROUP BY word ORDER BY cnt DESC LIMIT 10;
Ejemplo con
TOP()
:#legacySQL SELECT TOP(word, 10), COUNT(*) FROM ds.Table WHERE word contains 'th';
Usando el parámetro
multiplier
.Las siguientes consultas muestran cómo el parámetro
multiplier
afecta el resultado de la consulta. La primera consulta devuelve el número de nacimientos por mes en Wyoming. La segunda consulta usa paramultiplier
del parámetro para multiplicar los valorescnt
por 100.Ejemplo sin el parámetro
multiplier
:#legacySQL SELECT TOP(month,3) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
Devoluciones:
+-------+-------+ | month | cnt | +-------+-------+ | 7 | 19594 | | 5 | 19038 | | 8 | 19030 | +-------+-------+
Ejemplo con el parámetro
multiplier
:#legacySQL SELECT TOP(month,3,100) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
Devoluciones:
+-------+---------+ | month | cnt | +-------+---------+ | 7 | 1959400 | | 5 | 1903800 | | 8 | 1903000 | +-------+---------+
Nota: debe incluir COUNT(*)
en la cláusula SELECT
para usar TOP
.
Ejemplos avanzados
Desviación promedio y estándar agrupada por condición
La siguiente consulta devuelve la desviación promedio y estándar de los pesos del nacer en Ohio en 2003, agrupada por madres que sí y no fuman.
Ejemplo:
#legacySQL SELECT cigarette_use, /* Finds average and standard deviation */ AVG(weight_pounds) baby_weight, STDDEV(weight_pounds) baby_weight_stdev, AVG(mother_age) mother_age FROM [bigquery-public-data:samples.natality] WHERE year=2003 AND state='OH' /* Group the result values by those */ /* who smoked and those who didn't. */ GROUP BY cigarette_use;
Resultados de la consulta de filtro utilizando un valor agregado
Para filtrar los resultados de la consulta utilizando un valor agregado (por ejemplo, filtrarse por el valor de una
SUM
), use la funciónHAVING
.HAVING
compara un valor con un resultado determinado por una función de agregación, a diferencia deWHERE
, que opera en cada fila antes de la agregación.Ejemplo:
#legacySQL SELECT state, /* If 'is_male' is True, return 'Male', */ /* otherwise return 'Female' */ IF (is_male, 'Male', 'Female') AS sex, /* The count value is aliased as 'cnt' */ /* and used in the HAVING clause below. */ COUNT(*) AS cnt FROM [bigquery-public-data:samples.natality] WHERE state != '' GROUP BY state, sex HAVING cnt > 3000000 ORDER BY cnt DESC
Devoluciones:
+-------+--------+---------+ | state | sex | cnt | +-------+--------+---------+ | CA | Male | 7060826 | | CA | Female | 6733288 | | TX | Male | 5107542 | | TX | Female | 4879247 | | NY | Male | 4442246 | | NY | Female | 4227891 | | IL | Male | 3089555 | +-------+--------+---------+
Operadores aritméticos
Los operadores aritméticos toman argumentos numéricos y devuelven un resultado numérico. Cada argumento puede ser un valor numérico literal o un valor numérico devuelto por una consulta. Si la operación aritmética se evalúa con un resultado indefinido, la operación devuelve NULL
.
Sintaxis
Operador | Descripción | Ejemplo |
---|---|---|
+ | Suma | Devoluciones: 10 |
- | Sustracción | Devoluciones: 1 |
* | Multiplicación | Devoluciones: 24 |
/ | División | Devoluciones: 1.5 |
% | Módulo | Devoluciones: 2 |
Funciones bit a bit
Las funciones bit a bit operan a nivel de bits individuales y requieren argumentos numéricos. Para obtener más información sobre las funciones bit a bit, consulte la operación bitwise .
Tres funciones adicionales de bitwise, BIT_AND
, BIT_OR
y BIT_XOR
, se documentan en funciones agregadas .
Sintaxis
Operador | Descripción | Ejemplo |
---|---|---|
& | AND bit a bit | Devoluciones: 0 |
| | OR bit a bit | Devoluciones: 28 |
^ | XOR bit a bit | Devoluciones: 1 |
<< | Desplazamiento bit a bit a la izquierda | Devoluciones: 16 |
>> | Desplazamiento bit a bit a la derecha | Devoluciones: 2 |
~ | Bit a bit NO | Devoluciones: -3 |
BIT_COUNT( <numeric_expr> ) | Devuelve el número de bits que se establecen en | Devoluciones: 4 |
Funciones de casting
Las funciones de fundición cambian el tipo de datos de una expresión numérica. Las funciones de fundición son particularmente útiles para garantizar que los argumentos en una función de comparación tengan el mismo tipo de datos.
Sintaxis
Funciones de casting | |
---|---|
BOOLEAN() | Elenco al booleano. |
BYTES() | Echado a bytes. |
CAST(expr AS type) | Convierte expr en una variable de type . |
FLOAT() | Elenco para duplicar. |
HEX_STRING() | Castado a una cuerda hexadecimal. |
INTEGER() | Cast a entero. |
STRING() | Cast a la cuerda. |
-
BOOLEAN( <numeric_expr> )
- Devuelve
true
si<numeric_expr>
no es 0 y no es nulo. - Devuelve
false
si<numeric_expr>
es 0. - Devuelve
NULL
IF<numeric_expr>
es NULL.
- Devuelve
-
BYTES( string_expr )
- Devuelve
string_expr
como un valor de tipobytes
. -
CAST( expr AS type )
- Convierte
expr
en una variable detype
. -
FLOAT( expr )
- Devuelve
expr
como un doble. Elexpr
puede ser una cadena como'45.78'
, pero la función devuelveNULL
para valores no numéricos. -
HEX_STRING( numeric_expr )
- Devuelve
numeric_expr
como una cadena hexadecimal. -
INTEGER( expr )
- Cierre
expr
a un entero de 64 bits.- Devuelve nulo si
expr
es una cadena que no corresponde a un valor entero. - Devuelve el número de microsegundos ya que la época Unix si
expr
es una marca de tiempo.
- Devuelve nulo si
-
STRING( numeric_expr )
- Devuelve
numeric_expr
como una cadena.
Funciones de comparación
Las funciones de comparación devuelven true
o false
, basado en los siguientes tipos de comparaciones:
- Una comparación de dos expresiones.
- Una comparación de una expresión o conjunto de expresiones con un criterio específico, como estar en una lista especificada, ser nula o ser un valor opcional no deformento.
Algunas de las funciones que se enumeran a continuación valores de retorno distintos de true
o false
, pero los valores que devuelven se basan en las operaciones de comparación.
Puede usar expresiones numéricas o de cadena como argumentos para funciones de comparación. (Las constantes de cadena deben estar encerradas en cotizaciones simples o dobles.) Las expresiones pueden ser literales o valores obtenidos por una consulta. Las funciones de comparación se usan con mayor frecuencia como condiciones de filtrado en WHERE
cláusulas, pero se pueden usar en otras cláusulas.
Sintaxis
Funciones de comparación | |
---|---|
expr1 = expr2 | Devuelve true si las expresiones son iguales. |
expr1 != expr2 expr1 <> expr2 | Devuelve true si las expresiones no son iguales. |
expr1 > expr2 | Devuelve true si expr1 es mayor que expr2 . |
expr1 < expr2 | Devuelve true si expr1 es menor que expr2 . |
expr1 >= expr2 | Devuelve true si expr1 es mayor o igual a expr2 . |
expr1 <= expr2 | Devuelve true si expr1 es menor o igual a expr2 . |
expr1 BETWEEN expr2 AND expr3 | Devuelve true si el valor de expr1 es entre expr2 y expr3 , inclusive. |
expr IS NULL | Devuelve true si expr es nulo. |
expr IN() | Devuelve true si expr coincide con expr1 , expr2 o cualquier valor en los paréntesis. |
COALESCE() | Devuelve el primer argumento que no es nulo. |
GREATEST() | Devuelve el parámetro numeric_expr más grande. |
IFNULL() | Si el argumento no es nulo, devuelve el argumento. |
IS_INF() | Devuelve true si es positivo o negativo infinito. |
IS_NAN() | Devuelve true si el argumento es NaN . |
IS_EXPLICITLY_DEFINED() | Deprecido: usar expr IS NOT NULL en su lugar. |
LEAST() | Devuelve el argumento más pequeño del parámetro numeric_expr . |
NVL() | Si expr no es nulo, devuelve expr , de lo contrario devuelve null_default . |
-
expr1 = expr2
- Devuelve
true
si las expresiones son iguales. -
expr1 != expr2
expr1 <> expr2
- Devuelve
true
si las expresiones no son iguales. -
expr1 > expr2
- Devuelve
true
siexpr1
es mayor queexpr2
. -
expr1 < expr2
- Devuelve
true
siexpr1
es menor queexpr2
. -
expr1 >= expr2
- Devuelve
true
siexpr1
es mayor o igual aexpr2
. -
expr1 <= expr2
- Devuelve
true
siexpr1
es menor o igual aexpr2
. -
expr1 BETWEEN expr2 AND expr3
Devuelve
true
si el valor deexpr1
es mayor o igual aexpr2
, y menor o igual aexpr3
.-
expr IS NULL
- Devuelve
true
siexpr
es nulo. -
expr IN( expr1 , expr2, ...)
- Devuelve
true
siexpr
coincideexpr1
,expr2
o cualquier valor en los paréntesis. La palabra claveIN
es una taquigrafía eficiente para(expr = expr1 || expr = expr2 || ...)
. Las expresiones utilizadas con la palabra claveIN
deben ser constantes y deben coincidir con el tipo de datos deexpr
. La cláusulaIN
también se puede usar para crear semi uniones y anti-uniones. Para obtener más información, consulte Semi-un y anti-unión . -
COALESCE( <expr1> , <expr2> , ...)
- Devuelve el primer argumento que no es nulo.
-
GREATEST( numeric_expr1 , numeric_expr2 , ...)
Devuelve el parámetro
numeric_expr
más grande. Todos los parámetros deben ser numéricos, y todos los parámetros deben ser del mismo tipo. Si algún parámetro esNULL
, esta función devuelveNULL
.Para ignorar los valores
NULL
, use la funciónIFNULL
para cambiar los valoresNULL
a un valor que no afecta la comparación. En el siguiente ejemplo del código, la funciónIFNULL
se usa para cambiar los valoresNULL
a-1
, lo que no afecta la comparación entre números positivos.SELECT GREATEST(IFNULL(a,-1), IFNULL(b,-1)) FROM (SELECT 1 as a, NULL as b);
-
IFNULL( expr , null_default )
- Si
expr
no es nulo, devuelveexpr
, de lo contrario devuelvenull_default
. -
IS_INF( numeric_expr )
- Devuelve
true
sinumeric_expr
es un infinito positivo o negativo. -
IS_NAN( numeric_expr )
- Devuelve
true
sinumeric_expr
es el valor numéricoNaN
especial. -
IS_EXPLICITLY_DEFINED( expr )
Esta función está en desuso. Usar
expr IS NOT NULL
en su lugar.-
LEAST( numeric_expr1 , numeric_expr2 , ...)
Devuelve el parámetro
numeric_expr
más pequeño. Todos los parámetros deben ser numéricos, y todos los parámetros deben ser del mismo tipo. Si algún parámetro esNULL
, esta función devuelveNULL
-
NVL( expr , null_default )
- Si
expr
no es nulo, devuelveexpr
, de lo contrario devuelvenull_default
. La funciónNVL
es un alias paraIFNULL
.
Funciones de fecha y hora
Las siguientes funciones permiten la manipulación de fecha y hora para las marcas de tiempo UNIX, las cadenas de fecha y los tipos de datos de la marca de tiempo. Para obtener más información sobre el trabajo con el tipo de datos de la marca de tiempo, consulte Uso de TimeStamp .
Las funciones de fecha y hora que funcionan con las marcas de tiempo UNIX funcionan en Tiempo UNIX . Funciones de fecha y hora Los valores de devolución basados en la zona horaria de UTC.
Sintaxis
Funciones de fecha y hora | |
---|---|
CURRENT_DATE() | Devuelve la fecha actual en el formato %Y-%m-%d . |
CURRENT_TIME() | Devuelve el tiempo actual del servidor en el formato %H:%M:%S . |
CURRENT_TIMESTAMP() | Devuelve el tiempo actual del servidor en el formato %Y-%m-%d %H:%M:%S . |
DATE() | Devuelve la fecha en el formato %Y-%m-%d . |
DATE_ADD() | Agrega el intervalo especificado a un tipo de datos de marca de tiempo. |
DATEDIFF() | Devuelve el número de días entre dos tipos de datos de marca de tiempo. |
DAY() | Devuelve el día del mes como entero entre 1 y 31. |
DAYOFWEEK() | Regresa el día de la semana como entero entre 1 (domingo) y 7 (sábado). |
DAYOFYEAR() | Regresa el día del año como entero entre 1 y 366. |
FORMAT_UTC_USEC() | Devuelve una marca de tiempo Unix en el formato YYYY-MM-DD HH:MM:SS.uuuuuu . |
HOUR() | Devuelve la hora de una marca de tiempo como entero entre 0 y 23. |
MINUTE() | Devuelve los minutos de una marca de tiempo como entero entre 0 y 59. |
MONTH() | Devuelve el mes de una marca de tiempo como entero entre 1 y 12. |
MSEC_TO_TIMESTAMP() | Convierte una marca de tiempo Unix en milisegundos en una marca de tiempo. |
NOW() | Devuelve la marca de tiempo UNIX actual en microsegundos. |
PARSE_UTC_USEC() | Convierte una cadena de fecha en una marca de tiempo UNIX en microsegundos. |
QUARTER() | Devuelve el trimestre del año de una marca de tiempo como entero entre 1 y 4. |
SEC_TO_TIMESTAMP() | Convierte una marca de tiempo UNIX en segundos en una marca de tiempo. |
SECOND() | Devuelve los segundos de una marca de tiempo como entero entre 0 y 59. |
STRFTIME_UTC_USEC() | Devuelve una cadena de fecha en el formato date_format_str . |
TIME() | Devuelve una marca de tiempo en el formato %H:%M:%S . |
TIMESTAMP() | Convierta una cadena de fecha en una marca de tiempo. |
TIMESTAMP_TO_MSEC() | Convierte una marca de tiempo en una marca de tiempo UNIX en milisegundos. |
TIMESTAMP_TO_SEC() | Convierte una marca de tiempo en una marca de tiempo UNIX en segundos. |
TIMESTAMP_TO_USEC() | Convierte una marca de tiempo en una marca de tiempo UNIX en microsegundos. |
USEC_TO_TIMESTAMP() | Convierte una marca de tiempo UNIX en microsegundos en una marca de tiempo. |
UTC_USEC_TO_DAY() | Cambia una marca de tiempo UNIX en microsegundos al comienzo del día en que ocurre. |
UTC_USEC_TO_HOUR() | Cambia una marca de tiempo Unix en microsegundos al comienzo de la hora en la que ocurre. |
UTC_USEC_TO_MONTH() | Cambia una marca de tiempo UNIX en microsegundos al comienzo del mes en el que ocurre. |
UTC_USEC_TO_WEEK() | Devuelve una marca de tiempo UNIX en microsegundos que representa un día de semana. |
UTC_USEC_TO_YEAR() | Devuelve una marca de tiempo UNIX en microsegundos que representa el año. |
WEEK() | Devuelve la semana de una marca de tiempo como entero entre 1 y 53. |
YEAR() | Devuelve el año de una marca de tiempo. |
CURRENT_DATE()
Devuelve una cadena legible por humanos de la fecha actual en el formato
%Y-%m-%d
.Ejemplo:
SELECT CURRENT_DATE();
Devoluciones: 2013-02-01
CURRENT_TIME()
Devuelve una cadena legible por humanos de la hora actual del servidor en el formato
%H:%M:%S
.Ejemplo:
SELECT CURRENT_TIME();
Devuelve: 01:32:56
CURRENT_TIMESTAMP()
Devuelve un tipo de datos de marca de tiempo del tiempo actual del servidor en el formato
%Y-%m-%d %H:%M:%S
.Ejemplo:
SELECT CURRENT_TIMESTAMP();
Devoluciones: 2013-02-01 01:33:35 UTC
DATE( <timestamp> )
Devuelve una cadena legible por humanos de un tipo de datos de marca de tiempo en el formato
%Y-%m-%d
.Ejemplo:
SELECT DATE(TIMESTAMP('2012-10-01 02:03:04'));
Devoluciones: 2012-10-01
DATE_ADD( <timestamp> , <interval> ,
<interval_units> )Agrega el intervalo especificado a un tipo de datos de marca de tiempo. Los posibles valores de
interval_units
incluyenYEAR
,MONTH
,DAY
,HOUR
,MINUTE
ySECOND
. Siinterval
es un número negativo, el intervalo se resta del tipo de datos de marca de tiempo.Ejemplo:
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), 5, "YEAR");
Devoluciones: 2017-10-01 02:03:04 UTC
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), -5, "YEAR");
Devoluciones: 2007-10-01 02:03:04 UTC
DATEDIFF( <timestamp1> , <timestamp2> )
Devuelve el número de días entre dos tipos de datos de marca de tiempo. El resultado es positivo si el primer tipo de datos de la marca de tiempo se produce después del segundo tipo de datos de marca de tiempo, y de lo contrario el resultado es negativo.
Ejemplo:
SELECT DATEDIFF(TIMESTAMP('2012-10-02 05:23:48'), TIMESTAMP('2011-06-24 12:18:35'));
Devoluciones: 466
Ejemplo:
SELECT DATEDIFF(TIMESTAMP('2011-06-24 12:18:35'), TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: -466
DAY( <timestamp> )
Devuelve el día del mes de un tipo de datos de marca de tiempo como entero entre 1 y 31 años, inclusivamente.
Ejemplo:
SELECT DAY(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 2
DAYOFWEEK( <timestamp> )
Devuelve el día de la semana de un tipo de datos de marca de tiempo como entero entre 1 (domingo) y 7 (sábado), inclusivamente.
Ejemplo:
SELECT DAYOFWEEK(TIMESTAMP("2012-10-01 02:03:04"));
Devoluciones: 2
DAYOFYEAR( <timestamp> )
Devuelve el día del año de un tipo de datos de marca de tiempo como entero entre 1 y 366, inclusivamente. El entero 1 se refiere al 1 de enero.
Ejemplo:
SELECT DAYOFYEAR(TIMESTAMP("2012-10-01 02:03:04"));
Devoluciones: 275
FORMAT_UTC_USEC( <unix_timestamp> )
Devuelve una representación de cadena legible por humanos de una marca de tiempo UNIX en el formato
YYYY-MM-DD HH:MM:SS.uuuuuu
.Ejemplo:
SELECT FORMAT_UTC_USEC(1274259481071200);
Devoluciones: 2010-05-19 08: 58: 01.071200
HOUR( <timestamp> )
Devuelve la hora de un tipo de datos de marca de tiempo como entero entre 0 y 23, inclusivamente.
Ejemplo:
SELECT HOUR(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 5
MINUTE( <timestamp> )
Devuelve las actas de un tipo de datos de marca de tiempo como entero entre 0 y 59, inclusivamente.
Ejemplo:
SELECT MINUTE(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 23
MONTH( <timestamp> )
Devuelve el mes de un tipo de datos de marca de tiempo como entero entre 1 y 12, inclusivamente.
Ejemplo:
SELECT MONTH(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 10
-
MSEC_TO_TIMESTAMP( <expr> )
- Convierte una marca de tiempo UNIX en milisegundos a un tipo de datos de marca de tiempo.
Ejemplo:
SELECT MSEC_TO_TIMESTAMP(1349053323000);
Devoluciones: 2012-10-01 01:02:03 UTC
SELECT MSEC_TO_TIMESTAMP(1349053323000 + 1000)
Devoluciones: 2012-10-01 01:02:04 UTC
NOW()
Devuelve la marca de tiempo UNIX actual en microsegundos.
Ejemplo:
SELECT NOW();
Devoluciones: 1359685811687920
PARSE_UTC_USEC( <date_string> )
Convierte una cadena de fecha en una marca de tiempo UNIX en microsegundos.
date_string
debe tener el formatoYYYY-MM-DD HH:MM:SS[.uuuuuu]
. La parte fraccional del segundo puede tener hasta 6 dígitos de largo o puede omitirse.TimestAMP_TO_USEC es una función equivalente que convierte un argumento de tipo de datos de marca de tiempo en lugar de una cadena de fecha.
Ejemplo:
SELECT PARSE_UTC_USEC("2012-10-01 02:03:04");
Devoluciones: 1349056984000000
QUARTER( <timestamp> )
Devuelve el trimestre del año de un tipo de datos de marca de tiempo como entero entre 1 y 4, inclusivamente.
Ejemplo:
SELECT QUARTER(TIMESTAMP("2012-10-01 02:03:04"));
Devoluciones: 4
-
SEC_TO_TIMESTAMP( <expr> )
Convierte una marca de tiempo UNIX en segundos a un tipo de datos de marca de tiempo.
Ejemplo:
SELECT SEC_TO_TIMESTAMP(1355968987);
Devoluciones: 2012-12-20 02:03:07 UTC
SELECT SEC_TO_TIMESTAMP(INTEGER(1355968984 + 3));
Devoluciones: 2012-12-20 02:03:07 UTC
SECOND( <timestamp> )
Devuelve los segundos de un tipo de datos de marca de tiempo como entero entre 0 y 59, inclusivamente.
Durante un salto segundo , el rango entero es de entre 0 y 60, inclusivamente.
Ejemplo:
SELECT SECOND(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 48
STRFTIME_UTC_USEC( <unix_timestamp> ,
<date_format_str> )Devuelve una cadena de fecha legible para humanos en el formato date_format_str . date_format_str puede incluir caracteres de puntuación relacionados con la fecha (como / y - ) y caracteres especiales aceptados por la función Strftime en C ++ (como %D para el día del mes).
Utilice las funciones
UTC_USEC_TO_ <function_name>
Si planea agrupar los datos de consulta mediante intervalos de tiempo, como obtener todos los datos durante un cierto mes, porque las funciones son más eficientes.Ejemplo:
SELECT STRFTIME_UTC_USEC(1274259481071200, "%Y-%m-%d");
Devoluciones: 2010-05-19
-
TIME( <timestamp> )
Devuelve una cadena legible por humanos de un tipo de datos de marca de tiempo, en el formato
%H:%M:%S
.Ejemplo:
SELECT TIME(TIMESTAMP('2012-10-01 02:03:04'));
Devuelve: 02:03:04
-
TIMESTAMP( <date_string> )
Convierta una cadena de fecha en un tipo de datos de marca de tiempo.
Ejemplo:
SELECT TIMESTAMP("2012-10-01 01:02:03");
Devoluciones: 2012-10-01 01:02:03 UTC
-
TIMESTAMP_TO_MSEC( <timestamp> )
Convierte un tipo de datos de marca de tiempo en una marca de tiempo UNIX en milisegundos.
Ejemplo:
SELECT TIMESTAMP_TO_MSEC(TIMESTAMP("2012-10-01 01:02:03"));
Devoluciones: 1349053323000
-
TIMESTAMP_TO_SEC( <timestamp> )
- Convierte un tipo de datos de marca de tiempo en una marca de tiempo UNIX en segundos.
Ejemplo:
SELECT TIMESTAMP_TO_SEC(TIMESTAMP("2012-10-01 01:02:03"));
Devoluciones: 1349053323
-
TIMESTAMP_TO_USEC( <timestamp> )
Convierte un tipo de datos TIMESTAMP en una marca de tiempo UNIX en microsegundos.
Parse_utc_usec es una función equivalente que convierte un argumento de cadena de datos en lugar de un tipo de datos de marca de tiempo.
Ejemplo:
SELECT TIMESTAMP_TO_USEC(TIMESTAMP("2012-10-01 01:02:03"));
Devoluciones: 1349053323000000
-
USEC_TO_TIMESTAMP( <expr> )
Convierte una marca de tiempo UNIX en microsegundos a un tipo de datos de marca de tiempo.
Ejemplo:
SELECT USEC_TO_TIMESTAMP(1349053323000000);
Devoluciones: 2012-10-01 01:02:03 UTC
SELECT USEC_TO_TIMESTAMP(1349053323000000 + 1000000)
Devoluciones: 2012-10-01 01:02:04 UTC
-
UTC_USEC_TO_DAY( <unix_timestamp> )
Cambia una marca de tiempo UNIX en microsegundos al comienzo del día en que ocurre.
Por ejemplo, si
unix_timestamp
ocurre el 19 de mayo a las 08:58, esta función devuelve una marca de tiempo UNIX para el 19 de mayo a las 00:00 (medianoche).Ejemplo:
SELECT UTC_USEC_TO_DAY(1274259481071200);
Devoluciones: 1274227200000000
-
UTC_USEC_TO_HOUR( <unix_timestamp> )
Cambia una marca de tiempo Unix en microsegundos al comienzo de la hora en la que ocurre.
Por ejemplo, si
unix_timestamp
ocurre a las 08:58, esta función devuelve una marca de tiempo UNIX para 08:00 el mismo día.Ejemplo:
SELECT UTC_USEC_TO_HOUR(1274259481071200);
Devoluciones: 1274256000000000
-
UTC_USEC_TO_MONTH( <unix_timestamp> )
Cambia una marca de tiempo UNIX en microsegundos al comienzo del mes en el que ocurre.
Por ejemplo, si
unix_timestamp
ocurre el 19 de marzo, esta función devuelve una marca de tiempo UNIX para el 1 de marzo del mismo año.Ejemplo:
SELECT UTC_USEC_TO_MONTH(1274259481071200);
Devoluciones: 1272672000000000
-
UTC_USEC_TO_WEEK( <unix_timestamp> ,
<day_of_week> ) Devuelve una marca de tiempo UNIX en microsegundos que representa un día en la semana del argumento
unix_timestamp
. Esta función toma dos argumentos: una marca de tiempo UNIX en microsegundos y un día de la semana desde 0 (domingo) hasta 6 (sábado).Por ejemplo, si
unix_timestamp
ocurre el viernes 2008-04-11, y estableceday_of_week
a 2 (martes), la función devuelve una marca de tiempo UNIX para el martes 2008-04-08.Ejemplo:
SELECT UTC_USEC_TO_WEEK(1207929480000000, 2) AS tuesday;
Devoluciones: 1207612800000000
-
UTC_USEC_TO_YEAR( <unix_timestamp> )
Devuelve una marca de tiempo UNIX en microsegundos que representa el año del argumento
unix_timestamp
.Por ejemplo, si
unix_timestamp
ocurre en 2010, la función devuelve1274259481071200
, la representación de microsegundos de2010-01-01 00:00
.Ejemplo:
SELECT UTC_USEC_TO_YEAR(1274259481071200);
Devoluciones: 1262304000000000
-
WEEK( <timestamp> )
Devuelve la semana de un tipo de datos de marca de tiempo como entero entre 1 y 53, inclusivamente.
Las semanas comienzan el domingo, por lo que si el 1 de enero está en un día distinto del domingo, la semana 1 tiene menos de 7 días y el primer domingo del año es el primer día de la Semana 2.
Ejemplo:
SELECT WEEK(TIMESTAMP('2014-12-31'));
Devoluciones: 53
-
YEAR( <timestamp> )
- Devuelve el año de un tipo de datos de marca de tiempo.
Ejemplo:
SELECT YEAR(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 2012
Ejemplos avanzados
Convertir los resultados de la marca de tiempo entero en formato legible por humanos
La siguiente consulta encuentra los 5 momentos principales en el tiempo en los que tuvieron lugar la mayoría de las revisiones de Wikipedia. Para mostrar los resultados en un formato legible por humanos, use la función
FORMAT_UTC_USEC()
de BigQuery, que toma una marca de tiempo, en microsegundos, como una entrada. Esta consulta multiplica las marcas de tiempo del formato Wikipedia Posix (en segundos) en 1000000 para convertir el valor en microsegundos.Ejemplo:
#legacySQL SELECT /* Multiply timestamp by 1000000 and convert */ /* into a more human-readable format. */ TOP (FORMAT_UTC_USEC(timestamp * 1000000), 5) AS top_revision_time, COUNT (*) AS revision_count FROM [bigquery-public-data:samples.wikipedia];
Devoluciones:
+----------------------------+----------------+ | top_revision_time | revision_count | +----------------------------+----------------+ | 2002-02-25 15:51:15.000000 | 20976 | | 2002-02-25 15:43:11.000000 | 15974 | | 2010-02-02 03:34:51.000000 | 3 | | 2010-02-02 01:04:59.000000 | 3 | | 2010-02-01 23:55:05.000000 | 3 | +----------------------------+----------------+
RESULTADOS DE CONJUNTO POR TIMESTAMP
Es útil usar funciones de fecha y hora para los resultados de consulta grupal en cubos correspondientes a años, meses o días particulares. El siguiente ejemplo utiliza la función
UTC_USEC_TO_MONTH()
para mostrar cuántos caracteres usa cada contribuyente de Wikipedia en sus comentarios de revisión por mes.Ejemplo:
#legacySQL SELECT contributor_username, /* Return the timestamp shifted to the * start of the month, formatted in * a human-readable format. Uses the * 'LEFT()' string function to return only * the first 7 characters of the formatted timestamp. */ LEFT (FORMAT_UTC_USEC( UTC_USEC_TO_MONTH(timestamp * 1000000)),7) AS month, SUM(LENGTH(comment)) as total_chars_used FROM [bigquery-public-data:samples.wikipedia] WHERE (contributor_username != '' AND contributor_username IS NOT NULL) AND timestamp > 1133395200 AND timestamp < 1157068800 GROUP BY contributor_username, month ORDER BY total_chars_used DESC;
Devuelve (truncado):
+--------------------------------+---------+-----------------------+ | contributor_username | month | total_chars_used | +--------------------------------+---------+-----------------------+ | Kingbotk | 2006-08 | 18015066 | | SmackBot | 2006-03 | 7838365 | | SmackBot | 2006-05 | 5148863 | | Tawkerbot2 | 2006-05 | 4434348 | | Cydebot | 2006-06 | 3380577 | etc ...
Funciones IP
Las funciones IP convierten las direcciones IP hacia y desde la forma legible por humanos.
Sintaxis
Funciones IP | |
---|---|
FORMAT_IP() | Convierte 32 bits menos significativos de integer_value en cadena de dirección IPv4 legible por humanos. |
PARSE_IP() | Convierte una cadena que representa la dirección IPv4 a un valor entero sin firmar. |
FORMAT_PACKED_IP() | Devuelve una dirección IP legible por humanos en el Formulario 10.1.5.23 o 2620:0:1009:1:216:36ff:feef:3f . |
PARSE_PACKED_IP() | Devuelve una dirección IP en bytes . |
-
FORMAT_IP( integer_value )
- Convierte 32 bits menos significativos de
integer_value
en cadena de dirección IPv4 legible por humanos. Por ejemplo,FORMAT_IP(1)
devolverá la cadena'0.0.0.1'
. -
PARSE_IP( readable_ip )
- Convierte una cadena que representa la dirección IPv4 a un valor entero sin firmar. Por ejemplo,
PARSE_IP('0.0.0.1')
volverá1
Si la cadena no es una dirección IPv4 válida,PARSE_IP
devolveráNULL
.
BigQuery admite escribir direcciones IPv4 e IPv6 en cadenas empaquetadas, como datos binarios de 4 o 16 bytes en el orden de bytes de red. Las funciones descritas a continuación admiten las direcciones hacia y desde la forma legible humana. Estas funciones solo funcionan en campos de cadenas con IPS.
Sintaxis
-
FORMAT_PACKED_IP( packed_ip )
Devuelve una dirección IP legible por humanos, en el Formulario
10.1.5.23
o2620:0:1009:1:216:36ff:feef:3f
. Ejemplos:-
FORMAT_PACKED_IP('0123456789@ABCDE')
Devuelve'3031:3233:3435:3637:3839:4041:4243:4445'
-
FORMAT_PACKED_IP('0123')
Devuelve'48.49.50.51'
-
-
PARSE_PACKED_IP( readable_ip )
Devuelve una dirección IP en bytes . Si la cadena de entrada no es una dirección IPv4 o IPv6 válida,
PARSE_PACKED_IP
devolveráNULL
. Ejemplos:-
PARSE_PACKED_IP('48.49.50.51')
Devuelve'MDEyMw=='
-
PARSE_PACKED_IP('3031:3233:3435:3637:3839:4041:4243:4445')
Devuelve'MDEyMzQ1Njc4OUBBQkNERQ=='
-
Funciones JSON
Las funciones JSON de BigQuery le brindan la capacidad de encontrar valores dentro de sus datos JSON almacenados, utilizando expresiones similares a JSONPath .
El almacenamiento de datos JSON puede ser más flexible que declarar todos sus campos individuales en el esquema de su tabla, pero puede conducir a mayores costos. Cuando selecciona datos de una cadena JSON, se le cobra por escanear toda la cadena, que es más caro que si cada campo está en una columna separada. La consulta también es más lenta ya que toda la cadena debe analizarse en el momento de la consulta. Pero para los esquemas ad-hoc o que cambian rápidamente, la flexibilidad de JSON puede valer la pena el costo adicional.
Use funciones JSON en lugar de las funciones de expresión regulares de BigQuery si trabaja con datos estructurados, ya que las funciones JSON son más fáciles de usar.
Sintaxis
Funciones JSON | |
---|---|
JSON_EXTRACT() | Selecciona un valor de acuerdo con la expresión de JSONPath y devuelve una cadena JSON. |
JSON_EXTRACT_SCALAR() | Selecciona un valor de acuerdo con la expresión de JSONPath y devuelve un escalar JSON. |
-
JSON_EXTRACT( json , json_path )
Selecciona un valor en
json
de acuerdo con la expresión JSONPathjson_path
.json_path
debe ser una constante de cadena. Devuelve el valor en formato de cadena JSON.-
JSON_EXTRACT_SCALAR( json , json_path )
Selecciona un valor en
json
de acuerdo con la expresión JSONPathjson_path
.json_path
debe ser una constante de cadena. Devuelve un valor escalar JSON.
Operadores lógicos
Los operadores lógicos realizan una lógica binaria o ternaria sobre expresiones. La lógica binaria devuelve true
o false
. La lógica ternaria acomoda los valores NULL
y devuelve true
, false
o NULL
.
Sintaxis
Operadores lógicos | |
---|---|
expr AND expr | Devuelve true si ambas expresiones son verdaderas. |
expr OR expr | Devuelve true si una o ambas expresiones son verdaderas. |
NOT expr | Devuelve true si la expresión es falsa. |
-
expr AND expr
- Devuelve
true
si ambas expresiones son verdaderas. - Devuelve
false
si una o ambas expresiones son falsas. - Devuelve
NULL
si ambas expresiones son nulas o una expresión es verdadera y la otra es nula.
- Devuelve
-
expr OR expr
- Devuelve
true
si una o ambas expresiones son verdaderas. - Devuelve
false
si ambas expresiones son falsas. - Devuelve
NULL
si ambas expresiones son nulas o una expresión es falsa y la otra es nula.
- Devuelve
-
NOT expr
- Devuelve
true
si la expresión es falsa. - Devuelve
false
si la expresión si es verdadera. - Devuelve
NULL
si la expresión es nula.
NOT
puede usar con otras funciones como operador de negación. Por ejemplo,NOT IN(expr1, expr2)
oIS NOT NULL
.- Devuelve
Funciones matemáticas
Las funciones matemáticas toman argumentos numéricos y devuelven un resultado numérico. Cada argumento puede ser un valor numérico literal o un valor numérico devuelto por una consulta. Si la función matemática se evalúa como un resultado indefinido, la operación devuelve NULL
.
Sintaxis
Funciones matemáticas | |
---|---|
ABS() | Devuelve el valor absoluto del argumento. |
ACOS() | Devuelve el arco coseno del argumento. |
ACOSH() | Devuelve el coseno hiperbólico del arco del argumento. |
ASIN() | Devuelve el arco seno del argumento. |
ASINH() | Devuelve el seno hiperbólico del arco del argumento. |
ATAN() | Devuelve el arco tangente del argumento. |
ATANH() | Devuelve la tangente hiperbólica del arco del argumento. |
ATAN2() | Devuelve la tangente de arco de los dos argumentos. |
CEIL() | Redonde el argumento hasta el número entero más cercano y devuelve el valor redondeado. |
COS() | Devuelve el coseno del argumento. |
COSH() | Devuelve el coseno hiperbólico del argumento. |
DEGREES() | Convierte de radianes a grados. |
EXP() | Devuelve e al poder del argumento. |
FLOOR() | Redondea el argumento al número entero más cercano. |
LN() LOG() | Devuelve el logaritmo natural del argumento. |
LOG2() | Devuelve el logaritmo base-2 del argumento. |
LOG10() | Devuelve el logaritmo base-10 del argumento. |
PI() | Devuelve la constante π. |
POW() | Devuelve el primer argumento al poder del segundo argumento. |
RADIANS() | Convierte de grados a radianes. |
RAND() | Devuelve un valor flotante aleatorio en el rango 0.0 <= valor <1.0. |
ROUND() | Redonde el argumento hacia arriba o hacia abajo al número entero más cercano. |
SIN() | Devuelve el seno del argumento. |
SINH() | Devuelve el seno hiperbólico del argumento. |
SQRT() | Devuelve la raíz cuadrada de la expresión. |
TAN() | Devuelve la tangente del argumento. |
TANH() | Devuelve la tangente hiperbólica del argumento. |
-
ABS( numeric_expr )
- Devuelve el valor absoluto del argumento.
-
ACOS( numeric_expr )
- Devuelve el arco coseno del argumento.
-
ACOSH( numeric_expr )
- Devuelve el coseno hiperbólico del arco del argumento.
-
ASIN( numeric_expr )
- Devuelve el arco seno del argumento.
-
ASINH( numeric_expr )
- Devuelve el seno hiperbólico del arco del argumento.
-
ATAN( numeric_expr )
- Devuelve el arco tangente del argumento.
-
ATANH( numeric_expr )
- Devuelve la tangente hiperbólica del arco del argumento.
-
ATAN2( numeric_expr1 , numeric_expr2 )
- Devuelve la tangente de arco de los dos argumentos.
-
CEIL( numeric_expr )
- Redonde el argumento hasta el número entero más cercano y devuelve el valor redondeado.
-
COS( numeric_expr )
- Devuelve el coseno del argumento.
-
COSH( numeric_expr )
- Devuelve el coseno hiperbólico del argumento.
-
DEGREES( numeric_expr )
- Devuelve
numeric_expr
, convertido de radianes a grados. -
EXP( numeric_expr )
- Devuelve el resultado de elevar la constante "E", la base del logaritmo natural, al poder de Numeric_Expr .
-
FLOOR( numeric_expr )
- Redondea el argumento al número entero más cercano y devuelve el valor redondeado.
-
LN( numeric_expr )
LOG( numeric_expr )
- Devuelve el logaritmo natural del argumento.
-
LOG2( numeric_expr )
- Devuelve el logaritmo base-2 del argumento.
-
LOG10( numeric_expr )
- Devuelve el logaritmo base-10 del argumento.
-
PI()
- Devuelve la constante π. La función
PI()
requiere paréntesis para indicar que es una función, pero no toma argumentos entre esos paréntesis. Puede usarPI()
como una constante con funciones matemáticas y aritméticas. -
POW( numeric_expr1 , numeric_expr2 )
- Devuelve el resultado de elevar
numeric_expr1
al poder denumeric_expr2
. -
RADIANS( numeric_expr )
- Devuelve
numeric_expr
, convertido de grados a radianes. (Tenga en cuenta que los radianos π equivalen a 180 grados). -
RAND([ int32_seed ])
- Devuelve un valor flotante aleatorio en el rango 0.0 <= valor <1.0. Cada valor
int32_seed
siempre genera la misma secuencia de números aleatorios dentro de una consulta dada, siempre que no use una cláusulaLIMIT
. Si no se especificaint32_seed
, BigQuery usa la marca de tiempo actual como valor de semilla. -
ROUND( numeric_expr [, digits ])
- Redonde el argumento hacia arriba o hacia abajo al número entero más cercano (o si se especifica, al número especificado de dígitos) y devuelve el valor redondeado.
-
SIN( numeric_expr )
- Devuelve el seno del argumento.
-
SINH( numeric_expr )
- Devuelve el seno hiperbólico del argumento.
-
SQRT( numeric_expr )
- Devuelve la raíz cuadrada de la expresión.
-
TAN( numeric_expr )
- Devuelve la tangente del argumento.
-
TANH( numeric_expr )
- Devuelve la tangente hiperbólica del argumento.
Ejemplos avanzados
Consulta de caja delimitador
La siguiente consulta devuelve una colección de puntos dentro de una caja delimitadora rectangular centrada alrededor de San Francisco (37.46, -122.50).
Ejemplo:
#legacySQL SELECT year, month, AVG(mean_temp) avg_temp, MIN(min_temperature) min_temp, MAX(max_temperature) max_temp FROM [weather_geo.table] WHERE /* Return values between a pair of */ /* latitude and longitude coordinates */ lat / 1000 > 37.46 AND lat / 1000 < 37.65 AND long / 1000 > -122.50 AND long / 1000 < -122.30 GROUP BY year, month ORDER BY year, month ASC;
Consulta de círculo delimitador aproximado
Devuelva una colección de hasta 100 puntos dentro de un círculo aproximado determinado por el uso de la ley esférica de los cosenos , centrados en Denver Colorado (39.73, -104.98). Esta consulta utiliza las funciones matemáticas y trigonométricas de BigQuery, como
PI()
,SIN()
yCOS()
.Debido a que la Tierra no es una esfera absoluta, y la longitud+latitud converge en los polos, esta consulta devuelve una aproximación que puede ser útil para muchos tipos de datos.
Ejemplo:
#legacySQL SELECT distance, lat, long, temp FROM (SELECT ((ACOS(SIN(39.73756700 * PI() / 180) * SIN((lat/1000) * PI() / 180) + COS(39.73756700 * PI() / 180) * COS((lat/1000) * PI() / 180) * COS((-104.98471790 - (long/1000)) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance, AVG(mean_temp) AS temp, AVG(lat/1000) lat, AVG(long/1000) long FROM [weather_geo.table] WHERE month=1 GROUP BY distance) WHERE distance < 100 ORDER BY distance ASC LIMIT 100;
Funciones de expresión regular
BigQuery proporciona soporte de expresión regular utilizando la biblioteca RE2 ; Vea esa documentación para su sintaxis de expresión regular .
Tenga en cuenta que las expresiones regulares son coincidencias globales; Para comenzar a coincidir al comienzo de una palabra, debe usar el carácter ^.
Sintaxis
Funciones de expresión regular | |
---|---|
REGEXP_MATCH() | Devuelve verdadero si el argumento coincide con la expresión regular. |
REGEXP_EXTRACT() | Devuelve la parte del argumento que coincide con el grupo de captura dentro de la expresión regular. |
REGEXP_REPLACE() | Reemplaza una subcadena que coincide con una expresión regular. |
-
REGEXP_MATCH(' str ', 'reg_exp' )
Devuelve verdadero si STR coincide con la expresión regular. Para la coincidencia de cadenas sin expresiones regulares, use contiene en lugar de regexp_match.
Ejemplo:
#legacySQL SELECT word, COUNT(word) AS count FROM [bigquery-public-data:samples.shakespeare] WHERE (REGEXP_MATCH(word,r'\w\w\'\w\w')) GROUP BY word ORDER BY count DESC LIMIT 3;
Devoluciones:
+-------+-------+ | word | count | +-------+-------+ | ne'er | 42 | | we'll | 35 | | We'll | 33 | +-------+-------+
-
REGEXP_EXTRACT(' str ', ' reg_exp ')
Devuelve la parte de STR que coincide con el grupo de captura dentro de la expresión regular.
Ejemplo:
#legacySQL SELECT REGEXP_EXTRACT(word,r'(\w\w\'\w\w)') AS fragment FROM [bigquery-public-data:samples.shakespeare] GROUP BY fragment ORDER BY fragment LIMIT 3;
Devoluciones:
+----------+ | fragment | +----------+ | NULL | | Al'ce | | As'es | +----------+
-
REGEXP_REPLACE(' orig_str ', ' reg_exp ', 'replace_str')
Devuelve una cadena donde cualquier subcadena de orig_str que coincida con Reg_EXP se reemplaza con reemplazar_str . Por ejemplo, regexp_replace ('hola', 'lo', 'p') devuelve ayuda.
Ejemplo:
#legacySQL SELECT REGEXP_REPLACE(word, r'ne\'er', 'never') AS expanded_word FROM [bigquery-public-data:samples.shakespeare] WHERE REGEXP_MATCH(word, r'ne\'er') GROUP BY expanded_word ORDER BY expanded_word LIMIT 5;
Devoluciones:
+---------------+ | expanded_word | +---------------+ | Whenever | | never | | nevertheless | | whenever | +---------------+
Ejemplos avanzados
Filtro de resultados establecidos por coincidencia de expresión regular
Las funciones de expresión regulares de BigQuery se pueden usar para filtrar los resultados en una cláusula
WHERE
, así como para mostrar los resultados en laSELECT
. El siguiente ejemplo combina estos dos casos de uso de expresión regular en una sola consulta.Ejemplo:
#legacySQL SELECT /* Replace white spaces in the title with underscores. */ REGEXP_REPLACE(title, r'\s+', '_') AS regexp_title, revisions FROM (SELECT title, COUNT(revision_id) as revisions FROM [bigquery-public-data:samples.wikipedia] WHERE wp_namespace=0 /* Match titles that start with 'G', end with * 'e', and contain at least two 'o's. */ AND REGEXP_MATCH(title, r'^G.*o.*o.*e$') GROUP BY title ORDER BY revisions DESC LIMIT 100);
Uso de expresiones regulares en datos enteros o flotantes
Si bien las funciones de expresión regulares de BigQuery solo funcionan para los datos de cadena, es posible usar la función
STRING()
para fundir datos enteros o flotantes en el formato de cadena. En este ejemplo,STRING()
se usa para lanzar el valor enterocorpus_date
a una cadena, que luego se altera porREGEXP_REPLACE
.Ejemplo:
#legacySQL SELECT corpus_date, /* Cast the corpus_date to a string value */ REGEXP_REPLACE(STRING(corpus_date), '^16', 'Written in the sixteen hundreds, in the year \'' ) AS date_string FROM [bigquery-public-data:samples.shakespeare] /* Cast the corpus_date to string, */ /* match values that begin with '16' */ WHERE REGEXP_MATCH(STRING(corpus_date), '^16') GROUP BY corpus_date, date_string ORDER BY date_string DESC LIMIT 5;
Funciones de cadena
Las funciones de cadena operan con datos de cadena. Las constantes de cadena deben estar entre comillas simples o dobles. Las funciones de cadena distinguen entre mayúsculas y minúsculas de forma predeterminada. Puede añadir IGNORE CASE
al final de una consulta para habilitar la coincidencia sin distinción entre mayúsculas y minúsculas. IGNORE CASE
solo funciona con caracteres ASCII y solo en el nivel superior de la consulta.
Los comodines no son compatibles con estas funciones; Para la funcionalidad de expresión regular, use funciones de expresión regulares .
Sintaxis
Funciones de cadena | |
---|---|
CONCAT() | Devuelve la concatenación de dos o más cadenas, o nula si alguno de los valores es nulo. |
expr CONTAINS ' str ' | Devuelve true si expr contiene el argumento de cadena especificado. |
INSTR() | Returns the one-based index of the first occurrence of a string. |
LEFT() | Returns the leftmost characters of a string. |
LENGTH() | Devuelve la longitud de la cadena. |
LOWER() | Returns the original string with all characters in lower case. |
LPAD() | Inserts characters to the left of a string. |
LTRIM() | Elimina caracteres del lado izquierdo de una cadena. |
REPLACE() | Replaces all occurrences of a substring. |
RIGHT() | Devuelve los caracteres más a la derecha de una cadena. |
RPAD() | Inserts characters to the right side of a string. |
RTRIM() | Removes trailing characters from the right side of a string. |
SPLIT() | Splits a string into repeated substrings. |
SUBSTR() | Returns a substring ... |
UPPER() | Returns the original string with all characters in upper case. |
-
CONCAT(' str1 ', ' str2 ', '...')
str1 + str2 + ... - Returns the concatenation of two or more strings, or NULL if any of the values are NULL. Example: if
str1
isJava
andstr2
isScript
,CONCAT
returnsJavaScript
. -
expr CONTAINS ' str '
- Returns
true
ifexpr
contains the specified string argument. This is a case-sensitive comparison. -
INSTR(' str1 ', ' str2 ')
- Returns the one-based index of the first occurrence of str2 in str1 , or returns 0 if str2 does not occur in str1 .
-
LEFT(' str ', numeric_expr )
- Returns the leftmost numeric_expr characters of
str
. If the number is longer than str , the full string will be returned. Example:LEFT('seattle', 3)
returnssea
. -
LENGTH(' str ')
- Returns a numerical value for the length of the string. Example: if
str
is'123456'
,LENGTH
returns6
. -
LOWER(' str ')
- Returns the original string with all characters in lower case.
-
LPAD(' str1 ', numeric_expr , ' str2 ')
- Pads
str1
on the left withstr2
, repeatingstr2
until the result string is exactlynumeric_expr
characters. Example:LPAD('1', 7, '?')
returns??????1
. -
LTRIM(' str1 ' [, str2 ])
Removes characters from the left side of str1 . If str2 is omitted,
LTRIM
removes spaces from the left side of str1 . Otherwise,LTRIM
removes any characters in str2 from the left side of str1 (case-sensitive).Ejemplos:
SELECT LTRIM("Say hello", "yaS")
returns" hello"
.SELECT LTRIM("Say hello", " ySa")
returns"hello"
.-
REPLACE(' str1 ', ' str2 ', ' str3 ')
Replaces all instances of str2 within str1 with str3 .
-
RIGHT(' str ', numeric_expr )
- Returns the rightmost numeric_expr characters of
str
. If the number is longer than the string, it will return the whole string. Example:RIGHT('kirkland', 4)
returnsland
. -
RPAD(' str1 ', numeric_expr , ' str2 ')
-
RTRIM(' str1 ' [, str2 ])
Removes trailing characters from the right side of str1 . If str2 is omitted,
RTRIM
removes trailing spaces from str1 . Otherwise,RTRIM
removes any characters in str2 from the right side of str1 (case-sensitive).Ejemplos:
SELECT RTRIM("Say hello", "leo")
returns"Say h"
.SELECT RTRIM("Say hello ", " hloe")
returns"Say"
.-
SPLIT(' str ' [, 'delimiter'])
- Splits a string into repeated substrings. If
delimiter
is specified, theSPLIT
function breaksstr
into substrings, usingdelimiter
as the delimiter. -
SUBSTR(' str ', index [, max_len ])
- Returns a substring of
str
, starting atindex
. If the optionalmax_len
parameter is used, the returned string is a maximum ofmax_len
characters long. Counting starts at 1, so the first character in the string is in position 1 (not zero). Ifindex
is5
, the substring begins with the 5th character from the left instr
. Ifindex
is-4
, the substring begins with the 4th character from the right instr
. Example:SUBSTR(' awesome ', -4 , 4 )
returns the substringsome
. -
UPPER(' str ')
- Returns the original string with all characters in upper case.
Escaping special characters in strings
To escape special characters, use one of the following methods:
- Use
'\x DD '
notation, where'\x'
is followed by the two-digit hex representation of the character. - Use an escaping slash in front of slashes, single quotes, and double quotes.
- Use C-style sequences (
'\a', '\b', '\f', '\n', '\r', '\t',
and'\v'
) for other characters.
Some examples of escaping:
'this is a space: \x20'
'this string has \'single quote\' inside it'
'first line \n second line'
"double quotes are also ok"
'\070' -> ERROR: octal escaping is not supported
Funciones comodín de tabla
Table wildcard functions are a convenient way to query data from a specific set of tables. A table wildcard function is equivalent to a comma-separated union of all the tables matched by the wildcard function. When you use a table wildcard function, BigQuery only accesses and charges you for tables that match the wildcard. Table wildcard functions are specified in the query's FROM clause .
If you use table wildcard functions in a query, the functions no longer need to be contained in parentheses. For example, some of the following examples use parentheses, whereas others don't.
Cached results are not supported for queries against multiple tables using a wildcard function (even if the Use Cached Results option is checked). If you run the same wildcard query multiple times, you are billed for each query.
Sintaxis
Funciones comodín de tabla | |
---|---|
TABLE_DATE_RANGE() | Queries multiple daily tables that span a date range. |
TABLE_DATE_RANGE_STRICT() | Queries multiple daily tables that span a date range, with no missing dates. |
TABLE_QUERY() | Queries tables whose names match a specified predicate. |
-
TABLE_DATE_RANGE( prefix , timestamp1 , timestamp2 )
Queries daily tables that overlap with the time range between
<timestamp1>
and<timestamp2>
.Table names must have the following format:
<prefix><day>
, where<day>
is in the formatYYYYMMDD
.-
TIMESTAMP('2012-10-01 02:03:04')
-
DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')
Example: get tables between two days
This example assumes the following tables exist:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
#legacySQL SELECT name FROM TABLE_DATE_RANGE([myproject-1234:mydata.people], TIMESTAMP('2014-03-25'), TIMESTAMP('2014-03-27')) WHERE age >= 35
Matches the following tables:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
Example: get tables in a two-day range up to "now"
This example assumes the following tables exist in a project named
myproject-1234
:- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
#legacySQL SELECT name FROM (TABLE_DATE_RANGE([myproject-1234:mydata.people], DATE_ADD(CURRENT_TIMESTAMP(), -2, 'DAY'), CURRENT_TIMESTAMP())) WHERE age >= 35
Matches the following tables:
- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
-
-
TABLE_DATE_RANGE_STRICT( prefix , timestamp1 , timestamp2 )
This function is equivalent to
TABLE_DATE_RANGE
. The only difference is that if any daily table is missing in the sequence,TABLE_DATE_RANGE_STRICT
fails and returns aNot Found: Table <table_name>
error.Example: error on missing table
This example assumes the following tables exist:
- people20140325
- people20140327
#legacySQL SELECT name FROM (TABLE_DATE_RANGE_STRICT([myproject-1234:mydata.people], TIMESTAMP('2014-03-25'), TIMESTAMP('2014-03-27'))) WHERE age >= 35
The above example returns an error "Not Found" for the table "people20140326".
-
TABLE_QUERY( dataset , expr )
Queries tables whose names match the supplied
expr
. Theexpr
parameter must be represented as a string and must contain an expression to evaluate. For example,'length(table_id) < 3'
.Example: match tables whose names contain "oo" and have a length greater than 4
This example assumes the following tables exist:
- mydata.boo
- mydata.fork
- mydata.ooze
- mydata.spoon
#legacySQL SELECT speed FROM (TABLE_QUERY([myproject-1234:mydata], 'table_id CONTAINS "oo" AND length(table_id) >= 4'))
Matches the following tables:
- mydata.ooze
- mydata.spoon
Example: match tables whose names start with "boo", followed by 3-5 numeric digits
This example assumes the following tables exist in a project named
myproject-1234
:- mydata.book4
- mydata.book418
- mydata.boom12345
- mydata.boom123456789
- mydata.taboo999
#legacySQL SELECT speed FROM TABLE_QUERY([myproject-1234:mydata], 'REGEXP_MATCH(table_id, r"^boo[\d]{3,5}")')
Matches the following tables:
- mydata.book418
- mydata.boom12345
Funciones de URL
Sintaxis
Funciones de URL | |
---|---|
HOST() | Given a URL, returns the host name as a string. |
DOMAIN() | Given a URL, returns the domain as a string. |
TLD() | Given a URL, returns the top level domain plus any country domain in the URL. |
-
HOST(' url_str ')
- Given a URL, returns the host name as a string. Example: HOST('http://www.google.com:80/index.html') returns 'www.google.com'
-
DOMAIN(' url_str ')
- Given a URL, returns the domain as a string. Example: DOMAIN('http://www.google.com:80/index.html') returns 'google.com'.
-
TLD(' url_str ')
- Given a URL, returns the top level domain plus any country domain in the URL. Example: TLD('http://www.google.com:80/index.html') returns '.com'. TLD('http://www.google.co.uk:80/index.html') returns '.co.uk'.
Notas:
- These functions don't perform reverse DNS lookup, so if you call these functions using an IP address the functions will return segments of the IP address rather than segments of the host name.
- All of the URL parsing functions expect lower-case characters. Upper-case characters in the URL will result in a NULL or otherwise incorrect result. Consider passing input to this function through LOWER() if your data has mixed casing.
Ejemplo avanzado
Parse domain names from URL data
This query uses the DOMAIN()
function to return the most popular domains listed as repository homepages on GitHub. Note the use of HAVING to filter records using the result of the DOMAIN()
function. This is a useful function to determine referrer information from URL data.
Ejemplos:
#legacySQL SELECT DOMAIN(repository_homepage) AS user_domain, COUNT(*) AS activity_count FROM [bigquery-public-data:samples.github_timeline] GROUP BY user_domain HAVING user_domain IS NOT NULL AND user_domain != '' ORDER BY activity_count DESC LIMIT 5;
Devoluciones:
+-----------------+----------------+ | user_domain | activity_count | +-----------------+----------------+ | github.com | 281879 | | google.com | 34769 | | khanacademy.org | 17316 | | sourceforge.net | 15103 | | mozilla.org | 14091 | +-----------------+----------------+
To look specifically at TLD information, use the TLD()
function. This example displays the top TLDs that are not in a list of common examples.
#legacySQL SELECT TLD(repository_homepage) AS user_tld, COUNT(*) AS activity_count FROM [bigquery-public-data:samples.github_timeline] GROUP BY user_tld HAVING /* Only consider TLDs that are NOT NULL */ /* or in our list of common TLDs */ user_tld IS NOT NULL AND NOT user_tld IN ('','.com','.net','.org','.info','.edu') ORDER BY activity_count DESC LIMIT 5;
Devoluciones:
+----------+----------------+ | user_tld | activity_count | +----------+----------------+ | .de | 22934 | | .io | 17528 | | .me | 13652 | | .fr | 12895 | | .co.uk | 9135 | +----------+----------------+
Funciones de ventana
Window functions, also known as analytic functions, enable calculations on a specific subset, or "window", of a result set. Window functions make it easier to create reports that include complex analytics such as trailing averages and running totals.
Each window function requires an OVER
clause that specifies the window top and bottom. The three components of the OVER
clause (partitioning, ordering, and framing) provide additional control over the window. Partitioning enables you to divide the input data into logical groups that have a common characteristic. Ordering enables you to order the results within a partition. Framing enables you to create a sliding window frame within a partition that moves relative to the current row. You can configure the size of the moving window frame based on a number of rows or a range of values, such as a time interval.
#legacySQL SELECT <window_function> OVER ( [PARTITION BY <expr>] [ORDER BY <expr> [ASC | DESC]] [<window-frame-clause>] )
PARTITION BY
- Defines the base partition over which this function operates. Specify one or more comma-separated column names; one partition will be created for each distinct set of values for these columns, similar to a
GROUP BY
clause. IfPARTITION BY
is omitted, the base partition is all rows in the input to the window function. - The
PARTITION BY
clause also allows window functions to partition data and parallelize execution. If you wish to use a window function withallowLargeResults
, or if you intend to apply further joins or aggregations to the output of your window function, usePARTITION BY
to parallelize execution. -
JOIN EACH
andGROUP EACH BY
clauses can't be used on the output of window functions. To generate large query results when using window functions, you must usePARTITION BY
. -
ORDER BY
- Sorts the partition. If
ORDER BY
is absent, there is no guarantee of any default sorting order. Sorting occurs at the partition level, before any window frame clause is applied. If you specify aRANGE
window, you should add anORDER BY
clause. Default order isASC
. -
ORDER BY
is optional in some cases, but certain window functions, such as rank() or dense_rank() , require the clause. - If you use
ORDER BY
without specifyingROWS
orRANGE
,ORDER BY
implies that the window extends from the beginning of the partition to the current row. In the absence of anORDER BY
clause, the window is the entire partition. -
<window-frame-clause>
{ROWS | RANGE} {BETWEEN <start> AND <end> | <start> | <end>}
- A subset of the partition over which to operate. This can be the same size as the partition or smaller. If you use
ORDER BY
without awindow-frame-clause
, the default window frame isRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. If you omit bothORDER BY
and thewindow-frame-clause
, the default window frame is the entire partition.-
ROWS
- Defines a window in terms of row position, relative to the current row. For example, to add a column showing the sum of the preceding 5 rows of salary values, you would querySUM(salary) OVER (ROWS BETWEEN 5 PRECEDING AND CURRENT ROW)
. The set of rows typically includes the current row, but that is not required. -
RANGE
- Defines a window in terms of a range of values in a given column, relative to that column's value in the current row. Only operates on numbers and dates, where date values are simple integers (microseconds since the epoch). Neighboring rows with the same value are called peer rows. Peer rows of theCURRENT ROW
are included in a window frame that specifiesCURRENT ROW
. For example, if you specify the window end to beCURRENT ROW
and the following row in the window has the same value, it will be included in the function calculation. -
BETWEEN <start> AND <end>
- A range, inclusive of the start and end rows. The range need not include the current row, but<start>
must precede or equal<end>
. -
<start>
- Specifies the start offset for this window, relative to the current row. The following options are supported: where{UNBOUNDED PRECEDING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}
<expr>
is a positive integer,PRECEDING
indicates a preceding row number or range value, andFOLLOWING
indicates a following row number or range value.UNBOUNDED PRECEDING
means the first row of the partition. If the start precedes the window, it will be set to the first row of the partition. -
<end>
- Specifies the end offset for this window, relative to the current row. The following options are supported: where{UNBOUNDED FOLLOWING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}
<expr>
is a positive integer,PRECEDING
indicates a preceding row number or range value, andFOLLOWING
indicates a following row number or range value.UNBOUNDED FOLLOWING
means the last row of the partition. If end is beyond the end of the window, it will be set to the last row of the partition.
-
Unlike aggregation functions, which collapse many input rows into one output row, window functions return one row of output for each row of input. This feature makes it easier to create queries that calculate running totals and moving averages. For example, the following query returns a running total for a small dataset of five rows defined by SELECT
statements:
#legacySQL SELECT name, value, SUM(value) OVER (ORDER BY value) AS RunningTotal FROM (SELECT "a" AS name, 0 AS value), (SELECT "b" AS name, 1 AS value), (SELECT "c" AS name, 2 AS value), (SELECT "d" AS name, 3 AS value), (SELECT "e" AS name, 4 AS value);
Valor de retorno:
+------+-------+--------------+ | name | value | RunningTotal | +------+-------+--------------+ | a | 0 | 0 | | b | 1 | 1 | | c | 2 | 3 | | d | 3 | 6 | | e | 4 | 10 | +------+-------+--------------+
The following example calculates a moving average of the values in the current row and the row preceding it. The window frame comprises two rows that move with the current row.
#legacySQL SELECT name, value, AVG(value) OVER (ORDER BY value ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS MovingAverage FROM (SELECT "a" AS name, 0 AS value), (SELECT "b" AS name, 1 AS value), (SELECT "c" AS name, 2 AS value), (SELECT "d" AS name, 3 AS value), (SELECT "e" AS name, 4 AS value);
Valor de retorno:
+------+-------+---------------+ | name | value | MovingAverage | +------+-------+---------------+ | a | 0 | 0.0 | | b | 1 | 0.5 | | c | 2 | 1.5 | | d | 3 | 2.5 | | e | 4 | 3.5 | +------+-------+---------------+
Sintaxis
Funciones de ventana | |
---|---|
AVG() COUNT(*) COUNT([DISTINCT]) MAX() MIN() STDDEV() SUM() | The same operation as the corresponding Aggregate functions , but are computed over a window defined by the OVER clause. |
CUME_DIST() | Returns a double that indicates the cumulative distribution of a value in a group of values ... |
DENSE_RANK() | Returns the integer rank of a value in a group of values. |
FIRST_VALUE() | Returns the first value of the specified field in the window. |
LAG() | Enables you to read data from a previous row within a window. |
LAST_VALUE() | Returns the last value of the specified field in the window. |
LEAD() | Enables you to read data from a following row within a window. |
NTH_VALUE() | Returns the value of <expr> at position <n> of the window frame ... |
NTILE() | Divides the window into the specified number of buckets. |
PERCENT_RANK() | Returns the rank of the current row, relative to the other rows in the partition. |
PERCENTILE_CONT() | Returns an interpolated value that would map to the percentile argument with respect to the window ... |
PERCENTILE_DISC() | Returns the value nearest the percentile of the argument over the window. |
RANK() | Returns the integer rank of a value in a group of values. |
RATIO_TO_REPORT() | Returns the ratio of each value to the sum of the values. |
ROW_NUMBER() | Returns the current row number of the query result over the window. |
-
AVG( numeric_expr )
COUNT(*)
COUNT([DISTINCT] field )
MAX( field )
MIN( field )
STDDEV( numeric_expr )
SUM( field )
- These window functions perform the same operation as the corresponding Aggregate functions , but are computed over a window defined by the OVER clause.
Another significant difference is that the
COUNT([DISTINCT] field )
function produces exact results when used as a window function, with behavior similar to theEXACT_COUNT_DISTINCT()
aggregate function.In the example query, the
ORDER BY
clause causes the window to be computed from the start of the partition to the current row, which generates a cumulative sum for that year.#legacySQL SELECT corpus_date, corpus, word_count, SUM(word_count) OVER ( PARTITION BY corpus_date ORDER BY word_count) annual_total FROM [bigquery-public-data:samples.shakespeare] WHERE word='love' ORDER BY corpus_date, word_count
Devoluciones:
corpus_date cuerpo recuento de palabras annual_total 0 varios 37 37 0 sonetos 157 194 1590 2kinghenryvi 18 18 1590 1kinghenryvi 24 42 1590 3kinghenryvi 40 82 -
CUME_DIST()
Returns a double that indicates the cumulative distribution of a value in a group of values, calculated using the formula
<number of rows preceding or tied with the current row> / <total rows>
. Tied values return the same cumulative distribution value.This window function requires
ORDER BY
in theOVER
clause.#legacySQL SELECT word, word_count, CUME_DIST() OVER (PARTITION BY corpus ORDER BY word_count DESC) cume_dist, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
Devoluciones:
palabra recuento de palabras cume_dist pañuelo 29 0.2 satisfacción 5 0.4 disgusto 4 0.8 instrumentos 4 0.8 circunstancia 3 1.0 -
DENSE_RANK()
Returns the integer rank of a value in a group of values. The rank is calculated based on comparisons with other values in the group.
Tied values display as the same rank. The rank of the next value is incremented by 1. For example, if two values tie for rank 2, the next ranked value is 3. If you prefer a gap in the ranking list, use rank() .
This window function requires
ORDER BY
in theOVER
clause. Devoluciones:#legacySQL SELECT word, word_count, DENSE_RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) dense_rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
palabra recuento de palabras rango denso pañuelo 29 1 satisfacción 5 2 disgusto 4 3 instrumentos 4 3 circunstancia 3 4 -
FIRST_VALUE( <field_name> )
Returns the first value of
<field_name>
in the window. Devoluciones:#legacySQL SELECT word, word_count, FIRST_VALUE(word) OVER (PARTITION BY corpus ORDER BY word_count DESC) fv, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 1
palabra recuento de palabras fv imperfectamente 1 imperfectamente -
LAG( <expr> [, <offset> [, <default_value> ]])
Enables you to read data from a previous row within a window. Specifically,
LAG()
returns the value of<expr>
for the row located<offset>
rows before the current row. If the row doesn't exist,<default_value>
returns.#legacySQL SELECT word, word_count, LAG(word, 1) OVER (PARTITION BY corpus ORDER BY word_count DESC) lag, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
Devoluciones:
palabra recuento de palabras retraso pañuelo 29 nulo satisfacción 5 pañuelo disgusto 4 satisfacción instrumentos 4 disgusto circunstancia 3 instrumentos -
LAST_VALUE( <field_name> )
Returns the last value of
<field_name>
in the window.#legacySQL SELECT word, word_count, LAST_VALUE(word) OVER (PARTITION BY corpus ORDER BY word_count DESC) lv, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 1
Devoluciones:
palabra recuento de palabras lv imperfectamente 1 imperfectamente -
LEAD( <expr> [, <offset> [, <default_value> ]])
Enables you to read data from a following row within a window. Specifically,
LEAD()
returns the value of<expr>
for the row located<offset>
rows after the current row. If the row doesn't exist,<default_value>
returns. Devoluciones:#legacySQL SELECT word, word_count, LEAD(word, 1) OVER (PARTITION BY corpus ORDER BY word_count DESC) lead, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
palabra recuento de palabras dirigir pañuelo 29 satisfacción satisfacción 5 disgusto disgusto 4 instrumentos instrumentos 4 circunstancia circunstancia 3 nulo -
NTH_VALUE( <expr> , <n> )
Returns the value of
<expr>
at position<n>
of the window frame, where<n>
is a one-based index.-
NTILE( <num_buckets> )
Divides a sequence of rows into
<num_buckets>
buckets and assigns a corresponding bucket number, as an integer, with each row. Thentile()
function assigns the bucket numbers as equally as possible and returns a value from 1 to<num_buckets>
for each row. Devoluciones:#legacySQL SELECT word, word_count, NTILE(2) OVER (PARTITION BY corpus ORDER BY word_count DESC) ntile, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
palabra recuento de palabras azulejo pañuelo 29 1 satisfacción 5 1 disgusto 4 1 instrumentos 4 2 circunstancia 3 2 -
PERCENT_RANK()
Returns the rank of the current row, relative to the other rows in the partition. Returned values range between 0 and 1, inclusively. The first value returned is 0.0.
This window function requires
ORDER BY
in theOVER
clause. Devoluciones:#legacySQL SELECT word, word_count, PERCENT_RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) p_rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
palabra recuento de palabras broma pañuelo 29 0.0 satisfacción 5 0,25 disgusto 4 0.5 instrumentos 4 0.5 circunstancia 3 1.0 -
PERCENTILE_CONT( <percentile> )
Returns an interpolated value that would map to the percentile argument with respect to the window, after ordering them per the
ORDER BY
clause.<percentile>
must be between 0 and 1.This window function requires
ORDER BY
in theOVER
clause. Devoluciones:#legacySQL SELECT word, word_count, PERCENTILE_CONT(0.5) OVER (PARTITION BY corpus ORDER BY word_count DESC) p_cont, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
palabra recuento de palabras p_cont pañuelo 29 4 satisfacción 5 4 disgusto 4 4 instrumentos 4 4 circunstancia 3 4 -
PERCENTILE_DISC( <percentile> )
Returns the value nearest the percentile of the argument over the window.
<percentile>
must be between 0 and 1.This window function requires
ORDER BY
in theOVER
clause. Devoluciones:#legacySQL SELECT word, word_count, PERCENTILE_DISC(0.5) OVER (PARTITION BY corpus ORDER BY word_count DESC) p_disc, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
palabra recuento de palabras p_disc pañuelo 29 4 satisfacción 5 4 disgusto 4 4 instrumentos 4 4 circunstancia 3 4 -
RANK()
Returns the integer rank of a value in a group of values. The rank is calculated based on comparisons with other values in the group.
Tied values display as the same rank. The rank of the next value is incremented according to how many tied values occurred before it. For example, if two values tie for rank 2, the next ranked value is 4, not 3. If you prefer no gaps in the ranking list, use dense_rank() .
This window function requires
ORDER BY
in theOVER
clause. Devoluciones:#legacySQL SELECT word, word_count, RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
palabra recuento de palabras rango pañuelo 29 1 satisfacción 5 2 disgusto 4 3 instrumentos 4 3 circunstancia 3 5 -
RATIO_TO_REPORT( <column> )
Returns the ratio of each value to the sum of the values, as a double between 0 and 1.
Devoluciones:#legacySQL SELECT word, word_count, RATIO_TO_REPORT(word_count) OVER (PARTITION BY corpus ORDER BY word_count DESC) r_to_r, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
palabra recuento de palabras r_to_r pañuelo 29 0.6444444444444445 satisfacción 5 0.1111111111111111 disgusto 4 0.08888888888888889 instrumentos 4 0.08888888888888889 circunstancia 3 0.06666666666666667 -
ROW_NUMBER()
Returns the current row number of the query result over the window, starting with 1.
Devoluciones:#legacySQL SELECT word, word_count, ROW_NUMBER() OVER (PARTITION BY corpus ORDER BY word_count DESC) row_num, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
palabra recuento de palabras número_de_fila pañuelo 29 1 satisfacción 5 2 disgusto 4 3 instrumentos 4 4 circunstancia 3 5
Otras funciones
Sintaxis
Otras funciones | |
---|---|
CASE WHEN ... THEN | Use CASE to choose among two or more alternate expressions in your query. |
CURRENT_USER() | Returns the email address of the user running the query. |
EVERY() | Returns true if the argument is true for all of its inputs. |
FROM_BASE64() | Converts the base-64 encoded input string into BYTES format. |
HASH() | Computes and returns a 64-bit signed hash value ... |
FARM_FINGERPRINT() | Computes and returns a 64-bit signed fingerprint value ... |
IF() | If first argument is true, returns second argument; otherwise returns third argument. |
POSITION() | Returns the one-based, sequential position of the argument. |
SHA1() | Returns a SHA1 hash, in BYTES format. |
SOME() | Returns true if argument is true for at least one of its inputs. |
TO_BASE64() | Converts the BYTES argument to a base-64 encoded string. |
-
CASE WHEN when_expr1 THEN then_expr1
WHEN when_expr2 THEN then_expr2 ...
ELSE else_expr END - Use CASE to choose among two or more alternate expressions in your query. WHEN expressions must be boolean, and all the expressions in THEN clauses and ELSE clause must be compatible types.
-
CURRENT_USER()
- Returns the email address of the user running the query.
-
EVERY( <condition> )
- Returns
true
ifcondition
is true for all of its inputs. When used with theOMIT IF
clause, this function is useful for queries that involve repeated fields. -
FROM_BASE64( <str> )
- Converts the base64-encoded input string
str
into BYTES format. To convert BYTES to a base64-encoded string, use TO_BASE64() . -
HASH( expr )
- Computes and returns a 64-bit signed hash value of the bytes of
expr
as defined by the CityHash library (version 1.0.3). Any string or integer expression is supported and the function respectsIGNORE CASE
for strings, returning case invariant values. -
FARM_FINGERPRINT( expr )
- Computes and returns a 64-bit signed fingerprint value of the
STRING
orBYTES
input using theFingerprint64
function from the open-source FarmHash library . The output of this function for a particular input will never change and matches the output of theFARM_FINGERPRINT
function when using GoogleSQL . RespectsIGNORE CASE
for strings, returning case invariant values. -
IF( condition , true_return , false_return )
- Returns either
true_return
orfalse_return
, depending on whethercondition
is true or false. The return values can be literals or field-derived values, but they must be the same data type. Field-derived values do not need to be included in theSELECT
clause. -
POSITION( field )
- Returns the one-based, sequential position of field within a set of repeated fields.
-
SHA1( <str> )
-
#legacySQL SELECT TO_BASE64(SHA1(corpus)) FROM [bigquery-public-data:samples.shakespeare] LIMIT 100;
-
SOME( <condition> )
- Returns
true
ifcondition
is true for at least one of its inputs. When used with theOMIT IF
clause, this function is useful for queries that involve repeated fields. -
TO_BASE64( <bin_data> )
To convert a base64-encoded string to BYTES, use FROM_BASE64() .#legacySQL SELECT TO_BASE64(SHA1(title)) FROM [bigquery-public-data:samples.wikipedia] LIMIT 100;
Ejemplos avanzados
Bucketing results into categories using conditionals
The following query uses a
CASE/WHEN
block to bucket results into "region" categories based on a list of states. If the state does not appear as an option in one of theWHEN
statements, the state value will default to "None."Ejemplo:
#legacySQL SELECT CASE WHEN state IN ('WA', 'OR', 'CA', 'AK', 'HI', 'ID', 'MT', 'WY', 'NV', 'UT', 'CO', 'AZ', 'NM') THEN 'West' WHEN state IN ('OK', 'TX', 'AR', 'LA', 'TN', 'MS', 'AL', 'KY', 'GA', 'FL', 'SC', 'NC', 'VA', 'WV', 'MD', 'DC', 'DE') THEN 'South' WHEN state IN ('ND', 'SD', 'NE', 'KS', 'MN', 'IA', 'MO', 'WI', 'IL', 'IN', 'MI', 'OH') THEN 'Midwest' WHEN state IN ('NY', 'PA', 'NJ', 'CT', 'RI', 'MA', 'VT', 'NH', 'ME') THEN 'Northeast' ELSE 'None' END as region, average_mother_age, average_father_age, state, year FROM (SELECT year, state, SUM(mother_age)/COUNT(mother_age) as average_mother_age, SUM(father_age)/COUNT(father_age) as average_father_age FROM [bigquery-public-data:samples.natality] WHERE father_age < 99 GROUP BY year, state) ORDER BY year LIMIT 5;
Devoluciones:
+--------+--------------------+--------------------+-------+------+ | region | average_mother_age | average_father_age | state | year | +--------+--------------------+--------------------+-------+------+ | South | 24.342600163532296 | 27.683769419460344 | AR | 1969 | | West | 25.185041908446163 | 28.268214055448098 | AK | 1969 | | West | 24.780776677578217 | 27.831181063905248 | CA | 1969 | | West | 25.005834769924412 | 27.942978384829598 | AZ | 1969 | | South | 24.541730952905738 | 27.686430093306885 | AL | 1969 | +--------+--------------------+--------------------+-------+------+
Simulating a Pivot Table
Use conditional statements to organize the results of a subselect query into rows and columns. In the example below, results from a search for most revised Wikipedia articles that start with the value 'Google' are organized into columns where the revision counts are displayed if they meet various criteria.
Ejemplo:
#legacySQL SELECT page_title, /* Populate these columns as True or False, */ /* depending on the condition */ IF (page_title CONTAINS 'search', INTEGER(total), 0) AS search, IF (page_title CONTAINS 'Earth' OR page_title CONTAINS 'Maps', INTEGER(total), 0) AS geo, FROM /* Subselect to return top revised Wikipedia articles */ /* containing 'Google', followed by additional text. */ (SELECT TOP (title, 5) as page_title, COUNT (*) as total FROM [bigquery-public-data:samples.wikipedia] WHERE REGEXP_MATCH (title, r'^Google.+') AND wp_namespace = 0 );
Devoluciones:
+---------------+--------+------+ | page_title | search | geo | +---------------+--------+------+ | Google search | 4261 | 0 | | Google Earth | 0 | 3874 | | Google Chrome | 0 | 0 | | Google Maps | 0 | 2617 | | Google bomb | 0 | 0 | +---------------+--------+------+
Using HASH to select a random sample of your data
Some queries can provide a useful result using random subsampling of the result set. To retrieve a random sampling of values, use the
HASH
function to return results in which the modulo "n" of the hash equals zero.For example, the following query will find the
HASH()
of the "title" value, and then checks if that value modulo "2" is zero. This should result in about 50% of the values being labeled as "sampled." To sample fewer values, increase the value of the modulo operation from "2" to something larger. The query uses theABS
function in combination withHASH
, becauseHASH
can return negative values, and the modulo operator on a negative value yields a negative value.Ejemplo:
#legacySQL SELECT title, HASH(title) AS hash_value, IF(ABS(HASH(title)) % 2 == 1, 'True', 'False') AS included_in_sample FROM [bigquery-public-data:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 5;