Sintaxis, funciones y operadores de SQL antiguo
En este documento se detalla la sintaxis, las funciones y los operadores de las consultas de SQL antiguo. La sintaxis de consulta preferida para BigQuery es GoogleSQL. Para obtener información sobre GoogleSQL, consulta la sintaxis de las consultas de GoogleSQL.
Sintaxis de consulta
Nota: En las palabras clave no se distingue entre mayúsculas y minúsculas. En este documento, las palabras clave, como SELECT
, se escriben con mayúscula inicial con fines ilustrativos.
Cláusula SELECT
La cláusula SELECT
especifica una lista de expresiones que se van a calcular. Las expresiones de la cláusula SELECT
pueden contener nombres de campos, literales y llamadas a funciones (incluidas funciones de agregación y funciones de ventana), así como combinaciones de los 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 usar en las cláusulas GROUP BY
, HAVING
y ORDER BY
de la consulta, pero no en las cláusulas FROM
, WHERE
ni OMIT RECORD IF
, ni tampoco en otras expresiones de la misma cláusula SELECT
.
Notas:
-
Si usas una función de agregación en tu cláusula
SELECT
, debes usar una función de agregación en todas las expresiones o tu consulta debe tener una cláusulaGROUP BY
que incluya todos los campos no agregados de tu 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. */
-
Puedes usar corchetes para escapar de las palabras reservadas
y usarlas como nombres de campo y alias. Por ejemplo, si tienes una columna llamada "partition", que es una palabra reservada en la sintaxis de BigQuery, las consultas que hagan referencia a ese campo fallarán y mostrarán mensajes de error confusos, a menos que la incluyas entre corchetes:
SELECT [partition] FROM ...
Ejemplo
En este ejemplo se definen alias en la cláusula SELECT
y, a continuación, se hace referencia a uno de ellos en la cláusula ORDER BY
. Ten en cuenta que no se puede hacer referencia a la columna palabra mediante el alias_palabra en la cláusula WHERE
. Se debe hacer referencia a ella por su nombre. El alias len tampoco se puede ver en la cláusula WHERE
. Se mostraría en 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 de agregación
aggregate_function WITHIN RECORD [ [ AS ] alias ]
La palabra clave WITHIN
hace que la función de agregación agregue los valores repetidos 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. Como la agregación por ámbito
genera resultados para cada registro, se pueden seleccionar expresiones no agregadas junto con expresiones agregadas por ámbito sin usar una cláusula GROUP BY
.
Lo más habitual es que uses el alcance RECORD
cuando utilices la agregación por alcance. Si tienes un esquema anidado y repetido muy complejo, puede que necesites realizar agregaciones en ámbitos de subregistros. Para ello, sustituye la palabra clave RECORD
de la sintaxis anterior por el nombre del nodo de tu esquema en el que quieras que se realice la agregación.
Para obtener más información sobre este comportamiento avanzado, consulta el artículo Gestionar datos.
Ejemplo
En este ejemplo se realiza una agregación COUNT
con ámbito y, a continuación, se filtran y ordenan 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 van a consultar. Las consultas de BigQuery se pueden ejecutar directamente en tablas, subconsultas, tablas combinadas y tablas modificadas por operadores especiales 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.
Hacer referencia a tablas
Cuando se hace referencia a una tabla, se deben especificar datasetId y tableId. project_name es opcional. Si no se especifica project_name, BigQuery utiliza el proyecto actual de forma predeterminada. Si el nombre del proyecto incluye un guion, debes poner entre corchetes toda la referencia de la tabla.
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 AS
opcional se puede añadir entre tableId y el alias para mejorar la legibilidad.
Cuando haces referencia a columnas de una tabla, puedes usar el nombre de columna simple o añadirle el prefijo del alias (si has especificado uno) o del datasetId y el tableId, siempre que no se haya especificado ningún project_name. El project_name no se puede incluir en el prefijo de la columna porque el carácter de dos puntos no está permitido en los nombres de los campos.
Ejemplos
En este ejemplo se hace referencia a una columna sin prefijo de tabla.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare];
En este ejemplo, se añade el prefijo datasetId y tableId al nombre de la columna. Ten en cuenta que el project_name no se puede incluir en este ejemplo. Este método solo funcionará si el conjunto de datos está en tu proyecto predeterminado actual.
#legacySQL SELECT samples.shakespeare.word FROM samples.shakespeare;
En este ejemplo, se añade un prefijo al nombre de la columna con un alias de tabla.
#legacySQL SELECT t.word FROM [bigquery-public-data:samples.shakespeare] AS t;
Tablas con particiones de rangos de números enteros
El SQL antiguo permite usar decoradores de tabla para hacer referencia a una partición específica de una tabla con particiones de rangos de números enteros. La clave para dirigirse a una partición de rango es el inicio del rango.
En el siguiente ejemplo se consulta la partición de intervalo que empieza por 30:
#legacySQL SELECT * FROM dataset.table$30;
Ten en cuenta que no puedes usar SQL antiguo para consultar toda una tabla con particiones de rangos de números enteros. En su lugar, la consulta devuelve un error como el siguiente:
Querying tables partitioned on a field is not supported in Legacy SQL
Usar subconsultas
Una subconsulta es una instrucción SELECT
anidada entre paréntesis. Las expresiones calculadas en la cláusula SELECT
de la subconsulta están disponibles para la consulta externa del mismo modo que lo estarían las columnas de una tabla.
Las subconsultas se pueden usar para calcular agregaciones y otras expresiones. En la subconsulta se puede usar toda la gama de operadores de SQL. Esto significa que una subconsulta puede contener otras subconsultas, que pueden realizar combinaciones y agregaciones de agrupaciones, etc.
Coma como UNION ALL
A diferencia de GoogleSQL, el lenguaje SQL antiguo usa la coma como operador UNION ALL
en lugar de como operador CROSS JOIN
. Este es un comportamiento antiguo que ha evolucionado porque, históricamente, BigQuery no admitía CROSS JOIN
y los usuarios de BigQuery necesitaban escribir consultas de UNION ALL
con regularidad. En GoogleSQL, las consultas que realizan uniones son especialmente detalladas. Si se usa la coma como operador de unión, estas consultas se pueden escribir de forma mucho más eficiente. Por ejemplo, esta consulta se puede usar para ejecutar una sola consulta en los 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 ejecutarse más lentamente 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 de comodín de tabla
El término función comodín de tabla hace referencia a un tipo especial de función exclusivo de BigQuery.
Estas funciones se usan en la cláusula FROM
para buscar una colección de nombres de tabla
con uno de los distintos tipos de filtros. Por ejemplo, la función TABLE_DATE_RANGE
se puede usar para consultar solo un conjunto específico de tablas diarias. Para obtener más información sobre estas funciones, consulta 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 de SQL habituales, BigQuery se ha diseñado para gestionar datos repetidos. Por este motivo, los usuarios de BigQuery a veces tienen que escribir consultas que manipulen la estructura de los registros repetidos. Una forma de hacerlo es usar el operador FLATTEN
.
FLATTEN
convierte un nodo del esquema de repetido a opcional. Dado un registro
con uno o varios valores de un campo repetido, FLATTEN
creará varios registros,
uno por cada valor del campo repetido. Todos los demás campos seleccionados del registro se duplican
en cada nuevo registro de salida. FLATTEN
se puede aplicar varias veces para eliminar
varios niveles de repetición.
Para obtener más información y ejemplos, consulta Gestionar datos.
Operador JOIN
BigQuery admite varios operadores JOIN
en cada cláusula FROM
.
Las operaciones JOIN
posteriores usan 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 JOIN
BigQuery admite operaciones INNER
, [FULL|RIGHT|LEFT] OUTER
y CROSS JOIN
. Si no se especifica, el valor predeterminado es INNER
.
Las operaciones CROSS JOIN
no permiten cláusulas ON
. CROSS JOIN
puede devolver una gran cantidad de datos y dar lugar a una consulta lenta e ineficiente o a una consulta
que supere los recursos máximos permitidos por consulta. Estas consultas fallarán y devolverán un error. Cuando sea posible, se recomienda usar consultas que no utilicen CROSS JOIN
. Por ejemplo, CROSS JOIN
se suele usar en lugares donde las funciones de ventana serían más eficientes.
Modificador EACH
El modificador EACH
es una sugerencia que indica a BigQuery que ejecute JOIN
con varias particiones. Esto resulta especialmente útil cuando sabes 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í. Cuando sea posible, usa JOIN
sin el modificador EACH
para obtener un mejor rendimiento.
Usa JOIN EACH
cuando tu consulta haya fallado y se haya mostrado un mensaje de error que indica que se han superado los recursos.
Combinación semi-interna y anti-interna
Además de admitir JOIN
en la cláusula FROM
, BigQuery también admite dos tipos de combinaciones en la cláusula WHERE
: combinaciones semi y anti-semi. Una semicombinación se especifica mediante la palabra clave IN
con una subconsulta, mientras que una anticombinación se especifica mediante la palabra clave NOT IN
.
Ejemplos
La siguiente consulta usa una semicombinación para buscar n-gramas en los que la primera palabra del n-grama también sea la segunda palabra de otro n-grama que tenga "AND" como tercera palabra.
#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 usa una unión parcial 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 los números de los otros 40 estados, puedes usar una anti-combinació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 las combinaciones semi o anti-semi correlacionadas. La subconsulta no puede hacer referencia a ningún campo de la consulta externa.
- La subconsulta utilizada en una combinación semi o anti-semi debe seleccionar exactamente un campo.
-
Los tipos del campo seleccionado y del campo que se usa en la consulta externa en la cláusula
WHERE
deben coincidir exactamente. BigQuery no realizará ningún tipo de conversión para las combinaciones semi o anti-semi.
Cláusula WHERE
La cláusula WHERE
, a veces llamada predicado, filtra los registros generados por la cláusula FROM
mediante una expresión booleana. Se pueden combinar varias condiciones con cláusulas booleanas AND
y OR
, que se pueden agrupar entre paréntesis. Los campos que se enumeran en una cláusula WHERE
no tienen por qué seleccionarse 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 la cláusula WHERE
.
Nota: Las funciones de agregación no se pueden usar en la cláusula WHERE
. Usa una cláusula HAVING
y una consulta externa si necesitas filtrar el resultado de una función de agregado.
Ejemplo
En el siguiente ejemplo se usa una disyunción de expresiones booleanas en la cláusula WHERE
(las dos expresiones unidas por un 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 estructura exclusiva de BigQuery. Es especialmente útil para tratar con esquemas anidados y repetidos. Es similar a una cláusula WHERE
, pero se diferencia en dos aspectos importantes. En primer lugar, usa 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) usar funciones de agregación con ámbito en su condición.
Además de filtrar registros completos, OMIT...IF
puede especificar un ámbito más reducido para filtrar solo partes de un registro. Para ello, se usa el nombre de un nodo que no sea hoja en el esquema en lugar de RECORD
en la cláusula OMIT...IF
. Los usuarios de BigQuery rara vez utilizan esta función. Puedes consultar más documentación sobre este comportamiento avanzado en la documentación de WITHIN
que aparece más arriba.
Si usa OMIT...IF
para excluir una parte de un registro de un campo repetido y la consulta también
selecciona otros campos repetidos de forma independiente, BigQuery omite una
parte de los otros registros repetidos de la consulta. Si ves el error
Cannot perform OMIT IF on repeated scope <scope> with independently repeating pass through field <field>,
te recomendamos que cambies a GoogleSQL. Para obtener información sobre cómo migrar instrucciones OMIT...IF
a GoogleSQL, consulta Migrar a GoogleSQL.
Ejemplo
Volviendo al ejemplo del modificador WITHIN
, se puede usar OMIT RECORD IF
para conseguir lo mismo que 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
te permite agrupar las filas que tienen los mismos valores en un campo o conjunto de campos determinado para que puedas calcular agregaciones de campos relacionados. La agrupación se produce después del filtrado realizado en la cláusula WHERE
, pero antes de que se calculen las expresiones de la cláusula SELECT
. Los resultados de la expresión no se pueden usar como claves de grupo en la cláusula GROUP BY
.
Ejemplo
Esta consulta busca las diez primeras palabras más comunes del conjunto de datos de ejemplo de trigramas.
Además de mostrar el uso de la cláusula GROUP BY
, se explica cómo se pueden usar los índices de posición en lugar de los nombres de los campos 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 que se realiza con una cláusula GROUP BY
se denomina agregación agrupada
. A diferencia de la agregación por ámbito, la agregación agrupada es habitual en la mayoría de los sistemas de procesamiento de SQL.
El modificador EACH
El modificador EACH
es una sugerencia que indica a BigQuery que ejecute GROUP BY
con varias particiones. Esto es especialmente útil cuando sabes que tu conjunto de datos contiene un gran número de valores distintos para las claves de grupo.
Antes, se recomendaba usar EACH
en muchos casos, pero ya no es así.
Si usas GROUP BY
sin el modificador EACH
, suele obtenerse un mejor rendimiento.
Usa GROUP EACH BY
cuando tu consulta haya fallado y se haya mostrado un mensaje de error que indica que se han superado los recursos.
Función ROLLUP
Cuando se usa la función ROLLUP
, BigQuery añade filas adicionales al resultado de la consulta que representan agregaciones acumuladas. Todos los campos que aparecen después de ROLLUP
deben incluirse entre un único conjunto de paréntesis. En las filas añadidas debido a la función ROLLUP
, NULL
indica las columnas en las que se agrega la información.
Ejemplo
Esta consulta genera recuentos anuales de nacimientos de niños y niñas a partir del conjunto de datos de natalidad de ejemplo.
#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. Observa que hay filas en las que una o ambas claves de grupo son NULL
. Estas filas son las filas de agregación.
+------+---------+----------+ | 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 | +------+---------+----------+
Cuando se usa la función ROLLUP
, se puede usar la función GROUPING
para distinguir entre las filas que se han añadido debido a la función ROLLUP
y las filas
que realmente tienen un valor NULL
para la clave de grupo.
Ejemplo
Esta consulta añade la función GROUPING
al ejemplo anterior para identificar mejor las filas añadidas 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 de la cláusula
SELECT
deben incluirse 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 usar 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 puede agrupar por valores de coma flotante y de doble precisión porque la función de igualdad de esos tipos no está bien definida.
-
Como el sistema es interactivo, las consultas que producen una gran cantidad de grupos pueden fallar. El uso de la función
TOP
en lugar deGROUP BY
puede solucionar algunos problemas de escalado.
Cláusula HAVING
La cláusula HAVING
se comporta exactamente igual que la cláusula WHERE
excepto 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 los resultados de la cláusula SELECT
correspondiente.
Ejemplo
Esta consulta calcula las palabras iniciales más comunes del conjunto de datos de muestra de n-gramas 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 de forma ascendente o descendente mediante uno o varios campos clave. Para ordenar por varios campos o alias, introdúcelos en una lista separada por comas. Los resultados se ordenan en los campos en el orden en el que aparecen en la lista.
Usa DESC
(descendente) o ASC
(ascendente) para especificar el orden.
ASC
es el valor predeterminado. Se puede especificar una dirección de orden diferente para cada clave de orden.
La cláusula ORDER BY
se evalúa después de la cláusula SELECT
, por lo que puede hacer referencia al resultado 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 del conjunto de resultados que se devuelve. Como las consultas de BigQuery suelen operar con un número muy elevado de filas, LIMIT
es una buena forma de evitar que las consultas se prolonguen demasiado, ya que solo se procesa un subconjunto de las filas.
Notas:
-
La cláusula
LIMIT
detendrá el procesamiento y devolverá los resultados cuando cumpla tus requisitos. Esto puede reducir el tiempo de procesamiento de algunas consultas, pero cuando especificas funciones de agregación, como COUNT o cláusulasORDER BY
, se debe procesar todo el conjunto de resultados antes de devolverlos. La cláusulaLIMIT
es la última que se evalúa. -
Una consulta con una cláusula
LIMIT
puede seguir siendo no determinista si no hay ningún operador en la consulta que garantice el orden del conjunto de resultados de salida. Esto se debe a que BigQuery se ejecuta con un gran número de trabajadores paralelos. No se garantiza el orden en el que se devuelven los trabajos paralelos. -
La cláusula
LIMIT
no puede contener ninguna función; solo acepta una constante numérica. -
Cuando se usa la cláusula
LIMIT
, los bytes totales procesados y los bytes facturados pueden variar en la misma consulta.
Gramática de las consultas
Las cláusulas individuales de las instrucciones SELECT
de BigQuery se describen en detalle más arriba. Aquí se presenta la gramática completa de las instrucciones de SELECT
de forma compacta con enlaces a las secciones correspondientes.
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 "{ }" contienen un conjunto de opciones.
- La barra vertical "|" indica un operador OR lógico.
- Una coma o una palabra clave seguida de puntos suspensivos entre 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 admitidos
La mayoría de las cláusulas de la instrucción SELECT
admiten funciones. Los campos a los que se hace referencia en una función no tienen que aparecer 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 de agregación | |
---|---|
AVG() |
Devuelve la media 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 no NULL ... |
COVAR_POP() |
Calcula la covarianza de la población de los valores ... |
COVAR_SAMP() |
Calcula la covarianza de muestra de los valores ... |
EXACT_COUNT_DISTINCT() |
Devuelve el número exacto de valores distintos no NULL del campo especificado. |
FIRST() |
Devuelve el primer valor secuencial del ámbito de la función. |
GROUP_CONCAT() |
Concatena varias cadenas en una sola cadena. |
GROUP_CONCAT_UNQUOTED() |
Concatena varias cadenas en una sola cadena. No añade 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 del ámbito de agregación actual en un campo repetido. |
NTH() |
Devuelve el enésimo valor secuencial ... |
QUANTILES() |
Calcula el mínimo, el máximo y los 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 muestral ... |
SUM() |
Devuelve la suma total de los valores ... |
TOP() ... COUNT(*) |
Devuelve los max_records registros principales por frecuencia. |
UNIQUE() |
Devuelve el conjunto de valores únicos no nulos ... |
VARIANCE() |
Calcula la varianza de los valores ... |
VAR_POP() |
Calcula la varianza de la población de los valores ... |
VAR_SAMP() |
Calcula la varianza de la muestra de los valores ... |
Operadores aritméticos | |
---|---|
+ |
Suma |
- |
Resta |
* |
Multiplicación |
/ |
División |
% |
Módulo |
Funciones de bit a bit | |
---|---|
& |
AND bit a bit |
| |
O bit a bit. |
^ |
XOR bit a bit |
<< |
Desplazamiento a la izquierda a nivel de bits |
>> |
Desplazamiento a la derecha a nivel de bits |
~ |
NOT bit a bit |
BIT_COUNT() |
Devuelve el número de bits ... |
Funciones de conversión | |
---|---|
BOOLEAN() |
Convierte el valor en booleano. |
BYTES() |
Convierte el contenido en bytes. |
CAST(expr AS type) |
Convierte expr en una variable de tipo type . |
FLOAT() |
Convertir a doble. |
HEX_STRING() |
Convierte el valor en una cadena hexadecimal. |
INTEGER() |
Convertir en número entero. |
STRING() |
Convertir en 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 , ambos incluidos. |
expr IS NULL |
Devuelve true si expr es NULL. |
expr IN() |
Devuelve true si expr coincide con
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: usa expr IS NOT NULL en su lugar. |
LEAST() |
Devuelve el parámetro numeric_expr 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() |
Añade 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 número entero entre 1 y 31. |
DAYOFWEEK() |
Devuelve el día de la semana como un número entero entre 1 (domingo) y 7 (sábado). |
DAYOFYEAR() |
Devuelve el día del año como un número 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 un número entero entre 0 y 23. |
MINUTE() |
Devuelve los minutos de una MARCA_DE_TIEMPO como un número entero entre 0 y 59. |
MONTH() |
Devuelve el mes de una marca de tiempo como un número entero entre 1 y 12. |
MSEC_TO_TIMESTAMP() |
Convierte una marca de tiempo UNIX en milisegundos en un valor 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 una marca de tiempo como un número entero entre 1 y 4. |
SEC_TO_TIMESTAMP() |
Convierte una marca de tiempo UNIX en segundos en un valor TIMESTAMP. |
SECOND() |
Devuelve los segundos de una marca de tiempo como un número entero entre 0 y 59. |
STRFTIME_UTC_USEC() |
Devuelve una cadena de fecha con el formato date_format_str. |
TIME() |
Devuelve una marca de tiempo en el formato %H:%M:%S . |
TIMESTAMP() |
Convierte una cadena de fecha en una marca de tiempo. |
TIMESTAMP_TO_MSEC() |
Convierte un valor de TIMESTAMP en una marca de tiempo UNIX en milisegundos. |
TIMESTAMP_TO_SEC() |
Convierte un valor de TIMESTAMP en una marca de tiempo UNIX en segundos. |
TIMESTAMP_TO_USEC() |
Convierte un valor de TIMESTAMP en una marca de tiempo UNIX en microsegundos. |
USEC_TO_TIMESTAMP() |
Convierte una marca de tiempo UNIX en microsegundos en un valor TIMESTAMP. |
UTC_USEC_TO_DAY() |
Cambia una marca de tiempo UNIX en microsegundos al principio del día en el que se produce. |
UTC_USEC_TO_HOUR() |
Cambia una marca de tiempo UNIX en microsegundos al principio de la hora en la que se produce. |
UTC_USEC_TO_MONTH() |
Desplaza una marca de tiempo UNIX en microsegundos al principio del mes en el que se produce. |
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 una marca de tiempo como un número entero entre 1 y 53. |
YEAR() |
Devuelve el año de una marca de tiempo. |
Funciones de IP | |
---|---|
FORMAT_IP() |
Convierte los 32 bits menos significativos de integer_value en una cadena de dirección IPv4 legible. |
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 en 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 arcocoseno del argumento. |
ACOSH() |
Devuelve el arco coseno hiperbólico del argumento. |
ASIN() |
Devuelve el arcoseno del argumento. |
ASINH() |
Devuelve el arcoseno hiperbólico del argumento. |
ATAN() |
Devuelve la arcotangente del argumento. |
ATANH() |
Devuelve la tangente hiperbólica inversa del argumento. |
ATAN2() |
Devuelve la arcotangente de los dos argumentos. |
CEIL() |
Redondea el argumento al número entero más próximo y devuelve el valor redondeado. |
COS() |
Devuelve el coseno del argumento. |
COSH() |
Devuelve el coseno hiperbólico del argumento. |
DEGREES() |
Convierte radianes en grados. |
EXP() |
Devuelve e elevado a la potencia del argumento. |
FLOOR() |
Redondea el argumento hacia abajo al número entero más próximo. |
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. |
RADIANS() |
Convierte grados en radianes. |
RAND() |
Devuelve un valor flotante aleatorio en el intervalo 0,0 <= valor < 1,0. |
ROUND() |
Redondea el argumento hacia arriba o hacia abajo al número entero más próximo. |
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 "true" si el argumento coincide con la expresión regular. |
REGEXP_EXTRACT() |
Devuelve la parte del argumento que coincide con el grupo de captura de la expresión regular. |
REGEXP_REPLACE() |
Sustituye 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 de base uno de la primera aparición de una cadena. |
LEFT() |
Devuelve los caracteres situados 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úscula. |
LPAD() |
Inserta caracteres a la izquierda de una cadena. |
LTRIM() |
Quita caracteres de la parte izquierda de una cadena. |
REPLACE() |
Sustituye todas las repeticiones de una subcadena. |
RIGHT() |
Devuelve los caracteres situados más a la derecha de una cadena. |
RPAD() |
Inserta caracteres en el lado derecho de una cadena. |
RTRIM() |
Quita los caracteres finales de la parte derecha 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úscula. |
Funciones de comodín de tabla | |
---|---|
TABLE_DATE_RANGE() |
Consulta varias tablas diarias que abarcan un periodo. |
TABLE_DATE_RANGE_STRICT() |
Consulta varias tablas diarias que abarcan un intervalo de fechas sin que falte ninguna. |
TABLE_QUERY() |
Consulta las tablas cuyos nombres coinciden con un predicado especificado. |
Funciones de URL | |
---|---|
HOST() |
Dada una URL, devuelve el nombre de host como cadena. |
DOMAIN() |
Dada una URL, devuelve el dominio como cadena. |
TLD() |
Dada una URL, devuelve el dominio de nivel superior más cualquier dominio de país de la URL. |
Funciones de ventana | |
---|---|
AVG() COUNT(*) COUNT([DISTINCT]) MAX() MIN() STDDEV() SUM() |
Es la misma operación que las funciones de agregación correspondientes, pero se calcula en una ventana definida por la cláusula OVER. |
CUME_DIST() |
Devuelve un valor de tipo double que indica la distribución acumulada de un valor en un grupo de valores. |
DENSE_RANK() |
Devuelve la clasificación entera de un valor en un grupo de valores. |
FIRST_VALUE() |
Devuelve el primer valor del campo especificado en la ventana. |
LAG() |
Te permite leer datos de una fila anterior de una ventana. |
LAST_VALUE() |
Devuelve el último valor del campo especificado en la ventana. |
LEAD() |
Te permite leer datos de una fila posterior 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 de segmentos especificado. |
PERCENT_RANK() |
Devuelve la clasificación de la fila actual en relación con las demás 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 próximo al percentil del argumento en la ventana. |
RANK() |
Devuelve la clasificación entera de un valor en un grupo de valores. |
RATIO_TO_REPORT() |
Devuelve la proporción de cada valor respecto a 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 |
Usa CASE para elegir entre dos o más expresiones alternativas de la consulta. |
CURRENT_USER() |
Devuelve la dirección de correo del usuario que ejecuta la consulta. |
EVERY() |
Devuelve el valor "true" si el argumento es verdadero para todas sus entradas. |
FROM_BASE64() |
Convierte la cadena de entrada codificada en base64 al formato BYTES. |
HASH() |
Calcula y devuelve un valor de hash con signo de 64 bits ... |
FARM_FINGERPRINT() |
Calcula y devuelve un valor de huella digital con signo 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 del argumento, empezando por 1. |
SHA1() |
Devuelve un hash SHA1 en formato BYTES. |
SOME() |
Devuelve el valor true si el argumento es verdadero en al menos una de sus entradas. |
TO_BASE64() |
Convierte el argumento BYTES en una cadena codificada en base64. |
Funciones de agregación
Las funciones de agregación devuelven valores que representan resúmenes de conjuntos de datos más grandes, lo que hace que estas funciones sean especialmente útiles para analizar registros. Una función de agregado opera en una colección de valores y devuelve un solo valor por tabla, grupo o ámbito:
- Agregación de tabla
Usa una función de agregación para resumir todas las filas de la tabla que cumplen los criterios de la consulta. Por ejemplo:
SELECT COUNT(f1) FROM ds.Table;
- Agregación de grupo
Usa 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 de ámbito
Esta función solo se aplica a las tablas que tienen campos anidados.
Usa una función de agregación y la palabra claveWITHIN
para agregar valores repetidos en un ámbito definido. Por ejemplo:SELECT COUNT(m1.f2) WITHIN RECORD FROM Table;
El ámbito puede ser
RECORD
, lo que corresponde a toda la fila, o bien un nodo (campo repetido de una fila). Las funciones de agregación operan en los valores del ámbito y devuelven resultados agregados para cada registro o nodo.
Puede aplicar una restricción a una función de agregado mediante una de las siguientes opciones:
-
Un alias en una subconsulta. 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 de agregación | |
---|---|
AVG() |
Devuelve la media 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 no NULL ... |
COVAR_POP() |
Calcula la covarianza de la población de los valores ... |
COVAR_SAMP() |
Calcula la covarianza de muestra de los valores ... |
EXACT_COUNT_DISTINCT() |
Devuelve el número exacto de valores distintos no NULL del campo especificado. |
FIRST() |
Devuelve el primer valor secuencial del ámbito de la función. |
GROUP_CONCAT() |
Concatena varias cadenas en una sola cadena. |
GROUP_CONCAT_UNQUOTED() |
Concatena varias cadenas en una sola cadena. No añade 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 del ámbito de agregación actual en un campo repetido. |
NTH() |
Devuelve el enésimo valor secuencial ... |
QUANTILES() |
Calcula el mínimo, el máximo y los 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 muestral ... |
SUM() |
Devuelve la suma total de los valores ... |
TOP() ... COUNT(*) |
Devuelve los max_records registros principales por frecuencia. |
UNIQUE() |
Devuelve el conjunto de valores únicos no nulos ... |
VARIANCE() |
Calcula la varianza de los valores ... |
VAR_POP() |
Calcula la varianza de la población de los valores ... |
VAR_SAMP() |
Calcula la varianza de la muestra de los valores ... |
AVG(numeric_expr)
- Devuelve la media de los valores de un grupo de filas calculada por
numeric_expr
. Las filas con un valor NULL 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 valores deNULL
. Esta función devuelveNULL
si todas las instancias denumeric_expr
dan como resultadoNULL
. 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 valores deNULL
. Esta función devuelveNULL
si todas las instancias denumeric_expr
dan como resultadoNULL
. BIT_XOR(numeric_expr)
- Devuelve el resultado de una operación
XOR
bit a bit entre cada instancia denumeric_expr
en todas las filas. Se ignoran los valores deNULL
. Esta función devuelveNULL
si todas las instancias denumeric_expr
dan como resultadoNULL
. 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) en el ámbito de la función. A menos que uses
COUNT(*)
con la funciónTOP
, es mejor que especifiques explícitamente el campo que quieres contar. COUNT([DISTINCT] field [, n])
- Devuelve el número total de valores no NULL en el ámbito de la función.
Si usa la palabra clave
DISTINCT
, la función devuelve el número de valores distintos del campo especificado. Ten en cuenta que el valor devuelto deDISTINCT
es una aproximación estadística y no se garantiza que sea exacto.Usa
EXACT_COUNT_DISTINCT()
para obtener una respuesta exacta.Si necesitas una mayor precisión de
, puedes especificar un segundo parámetro,COUNT(DISTINCT)
n
, que indica el umbral por debajo del cual se garantizan los resultados exactos. De forma predeterminada,n
es 1000, pero si le asignas un valor más alto, obtendrás resultados exactos paraCOUNT(DISTINCT)
hasta ese valor den
.n
Sin embargo, si asignas valores más grandes an
, se reducirá la escalabilidad de este operador y puede que aumente considerablemente el tiempo de ejecución de la consulta o que la consulta falle.Para calcular el número exacto de valores distintos, usa EXACT_COUNT_DISTINCT. Si quieres un enfoque más escalable, puedes usar
GROUP EACH BY
en los campos correspondientes y, a continuación, aplicarCOUNT(*)
. El enfoqueGROUP EACH BY
es más escalable, pero puede conllevar una ligera penalización del rendimiento inicial. 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 NULL del campo especificado. Para mejorar la escalabilidad y el rendimiento, usa COUNT(DISTINCT field).
FIRST(expr)
- Devuelve el primer valor secuencial del ámbito de la función.
GROUP_CONCAT('str' [, separator])
-
Concatena varias cadenas en una sola, donde cada valor está separado por el parámetro opcional
separator
. Si se omiteseparator
, BigQuery devuelve una cadena separada por comas.Si una cadena de los datos de origen contiene el carácter de comillas dobles,
GROUP_CONCAT
devuelve la cadena con comillas dobles añadidas. Por ejemplo, la cadenaa"b
se devolvería como"a""b"
. UsaGROUP_CONCAT_UNQUOTED
si prefieres que estas cadenas no se devuelvan con comillas dobles añadidas.Ejemplo:
#legacySQL SELECT GROUP_CONCAT(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
GROUP_CONCAT_UNQUOTED('str' [, separator])
-
Concatena varias cadenas en una sola, donde cada valor está separado por el parámetro opcional
separator
. Si se omiteseparator
, BigQuery devuelve una cadena separada por comas.A diferencia de
GROUP_CONCAT
, esta función no añadirá comillas dobles a los valores devueltos que incluyan el carácter de comillas dobles. Por ejemplo, la cadenaa"b
se devolverí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 del ámbito de la función.
MAX(field)
- Devuelve el valor máximo del ámbito de la función.
MIN(field)
- Devuelve el valor mínimo del ámbito de la función.
NEST(expr)
-
Agrega todos los valores del ámbito 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 por cada valor dex
distinto y contiene un campo repetido para todos los valores dey
emparejados conx
en la entrada de la consulta. La funciónNEST
requiere una cláusulaGROUP BY
.BigQuery aplana automáticamente los resultados de las consultas, por lo que, si usas la función
NEST
en la consulta de nivel superior, los resultados no contendrán campos repetidos. Usa la funciónNEST
cuando uses una subselección que produzca resultados intermedios para que la misma consulta los use de inmediato. NTH(n, field)
- Devuelve el
n
-ésimo valor secuencial en el ámbito de la función, donden
es una constante. La funciónNTH
empieza a contar en 1, por lo que no hay ningún término cero. Si el ámbito de la función tiene menos den
valores, la función devuelveNULL
. QUANTILES(expr[, buckets])
-
Calcula los valores mínimos, máximos y cuantiles aproximados de la expresión de entrada. Se ignoran los valores de entrada de
NULL
. Si la entrada está vacía o solo contieneNULL
, la salida seráNULL
. El número de cuantiles calculados se controla con el parámetro opcionalbuckets
, que incluye el mínimo y el máximo en el recuento. Para calcular los N-tiles aproximados, usa N+1buckets
. El valor predeterminado debuckets
es 100. Nota: El valor predeterminado de 100 no estima percentiles. Para estimar percentiles, usa al menos 101buckets
. Si se especifica explícitamente,buckets
debe ser al menos 2.El error fraccionario por cuantil es épsilon = 1 /
buckets
, lo que significa que el error disminuye a medida que aumenta el número de contenedores. 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 función
NTH
se puede usar para elegir un cuantil concreto, pero recuerda queNTH
se basa en 1 y queQUANTILES
devuelve el mínimo (cuantil "0") en la primera posición y el máximo (percentil "100" o N-cuantil "N") en la última posición. Por ejemplo,NTH(11, QUANTILES(expr, 21))
estima la mediana deexpr
, mientras queNTH(20, QUANTILES(expr, 21))
estima el vigintil 19 (percentil 95) deexpr
. Ambas estimaciones tienen un margen de error del 5 %.Para mejorar la precisión, usa más contenedores. Por ejemplo, para reducir el margen de error de los cálculos anteriores del 5% al 0,1%, utilice 1001 contenedores en lugar de 21 y ajuste el argumento de la función
NTH
en consecuencia. Para calcular la mediana con un error del 0,1 %, usaNTH(501, QUANTILES(expr, 1001))
. Para calcular el percentil 95 con un error del 0,1 %, usaNTH(951, QUANTILES(expr, 1001))
. STDDEV(numeric_expr)
- Devuelve la desviación estándar de los valores calculados por
numeric_expr
. Las filas con valor NULO no se incluyen en el cálculo. La funciónSTDDEV
es un alias deSTDDEV_SAMP
. STDDEV_POP(numeric_expr)
- Calcula la desviación estándar poblacional del valor calculado por
numeric_expr
. UsaSTDDEV_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 solo incluye una muestra representativa de la población, utiliceSTDDEV_SAMP()
. Para obtener más información sobre la desviación estándar de la población y de la muestra, consulta el artículo Desviación estándar en Wikipedia. STDDEV_SAMP(numeric_expr)
- Calcula la desviación estándar muestral del valor calculado por
numeric_expr
. UsaSTDDEV_SAMP()
para calcular la desviación estándar de una población completa a partir de una muestra representativa de la población. Si el conjunto de datos incluye a toda la población, usaSTDDEV_POP()
. Para obtener más información sobre la desviación estándar de la población y de la muestra, consulta el artículo Desviación estándar en Wikipedia. SUM(field)
- Devuelve la suma total de los valores del ámbito de la función. Se usa únicamente con tipos de datos numéricos.
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
- Devuelve los max_records registros principales por frecuencia. Consulta la descripción de TOP que aparece más abajo para obtener más información.
UNIQUE(expr)
- Devuelve el conjunto de valores únicos no nulos del ámbito de la función en un orden indefinido. Al igual que una cláusula
GROUP BY
grande sin la palabra claveEACH
, la consulta fallará con un error "Resources Exceeded" (Recursos superados) si hay demasiados valores distintos. Sin embargo, a diferencia deGROUP BY
, la funciónUNIQUE
se puede aplicar con una agregación acotada, lo que permite operar de forma 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 valor NULO no se incluyen en el cálculo. La funciónVARIANCE
es un alias deVAR_SAMP
. VAR_POP(numeric_expr)
- Calcula la varianza de la población de los valores calculados por
numeric_expr
. Para obtener más información sobre la desviación estándar de la población y de la muestra, consulta el artículo Desviación estándar en Wikipedia. VAR_SAMP(numeric_expr)
- Calcula la varianza de la muestra de los valores calculados por
numeric_expr
. Para obtener más información sobre la desviación estándar de la población y de la muestra, consulta el artículo Desviación estándar en Wikipedia.
Función TOP()
TOP es una función alternativa a la cláusula GROUP BY. Se usa como sintaxis simplificada de GROUP BY ... ORDER BY ... LIMIT ...
. Por lo general, la función TOP se ejecuta más rápido que la consulta ... GROUP BY ... ORDER BY ... LIMIT ...
completa, pero solo puede devolver resultados aproximados. A continuación, se indica la sintaxis de la función TOP:
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
Cuando se usa TOP en una cláusula SELECT
, debe incluir COUNT(*)
como uno de los campos.
Una consulta que usa la función TOP() solo puede devolver dos campos: el campo TOP y el valor COUNT(*).
field|alias
- Campo o alias que se va a devolver.
max_values
- [Opcional] Número máximo de resultados que se devolverán. El valor predeterminado es 20.
multiplier
- Número entero positivo que aumenta los valores devueltos por
COUNT(*)
en el múltiplo especificado.
Ejemplos de TOP()
-
Ejemplos de consultas 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");
-
Comparar
TOP()
conGROUP BY...ORDER BY...LIMIT
La consulta devuelve, por orden, las 10 palabras más usadas que contienen "th" y el número de documentos en los que se han usado. 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';
-
Usa el parámetro
multiplier
.En las siguientes consultas se muestra cómo afecta el parámetro
multiplier
al resultado de la consulta. La primera consulta devuelve el número de nacimientos al mes en Wyoming. La segunda consulta usa el parámetromultiplier
para multiplicar los valores decnt
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";
Devuelve:
+-------+-------+ | 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";
Devuelve:
+-------+---------+ | month | cnt | +-------+---------+ | 7 | 1959400 | | 5 | 1903800 | | 8 | 1903000 | +-------+---------+
Nota: Para usar TOP
, debes incluir COUNT(*)
en la cláusula SELECT
.
Ejemplos avanzados
-
Media y desviación estándar agrupadas por condición
La consulta siguiente devuelve el promedio y la desviación estándar de los pesos de recién nacidos en Ohio en 2003, agrupados según si las madres fuman o 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;
-
Filtrar los resultados de una consulta con un valor agregado
Para filtrar los resultados de una consulta mediante un valor agregado (por ejemplo, para filtrar por el valor de un
SUM
), usa 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
Devuelve:
+-------+--------+---------+ | 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 literal numérico o un valor numérico devuelto por una consulta. Si la operación aritmética da como resultado un valor indefinido, la operación devuelve NULL
.
Sintaxis
Operador | Descripción | Ejemplo |
---|---|---|
+ | Suma |
Devoluciones: 10 |
- | Resta |
Devoluciones: 1 |
* | Multiplicación |
Devoluciones: 24 |
/ | División |
Devoluciones: 1,5 |
% | Módulo |
Devoluciones: 2 |
Funciones de 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, consulta Operación bit a bit.
En funciones de agregación se documentan tres funciones bit a bit adicionales: BIT_AND
, BIT_OR
y BIT_XOR
.
Sintaxis
Operador | Descripción | Ejemplo |
---|---|---|
& | AND bit a bit |
Devoluciones: 0 |
| | O bit a bit. |
Devoluciones: 28 |
^ | XOR bit a bit |
Devoluciones: 1 |
<< | Desplazamiento a la izquierda a nivel de bits |
Devoluciones: 16 |
>> | Desplazamiento a la derecha a nivel de bits |
Devoluciones: 2 |
~ | NOT bit a bit |
Devoluciones: -3 |
BIT_COUNT(<numeric_expr>) |
Devuelve el número de bits que están definidos en |
Devoluciones: 4 |
Funciones de conversión
Las funciones de conversión cambian el tipo de datos de una expresión numérica. Las funciones de conversión son particularmente útiles para garantizar que los argumentos de una función de comparación tengan el mismo tipo de datos.
Sintaxis
Funciones de conversión | |
---|---|
BOOLEAN() |
Convierte el valor en booleano. |
BYTES() |
Convierte el contenido en bytes. |
CAST(expr AS type) |
Convierte expr en una variable de tipo type . |
FLOAT() |
Convertir a doble. |
HEX_STRING() |
Convierte el valor en una cadena hexadecimal. |
INTEGER() |
Convertir en número entero. |
STRING() |
Convertir en cadena. |
BOOLEAN(<numeric_expr>)
-
- Devuelve
true
si<numeric_expr>
no es 0 ni NULL. - Devuelve
false
si<numeric_expr>
es 0. - Devuelve
NULL
si<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 de tipotype
. FLOAT(expr)
-
Devuelve
expr
como un valor de doble precisión.expr
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)
-
Convierte
expr
en un entero de 64 bits.- Devuelve NULL si
expr
es una cadena que no corresponde a un valor entero. - Devuelve el número de microsegundos transcurridos desde el inicio del registro de tiempo Unix si
expr
es una marca de tiempo.
- Devuelve NULL si
STRING(numeric_expr)
- devuelve
numeric_expr
como una cadena.
Funciones de comparación
Las funciones de comparación devuelven true
o false
en función de los siguientes tipos de comparaciones:
- Comparación de dos expresiones.
- Comparación de una expresión o un conjunto de expresiones con un criterio específico, como estar en una lista determinada, ser NULL o ser un valor opcional no predeterminado.
Algunas de las funciones que se indican a continuación devuelven valores distintos de true
o false
, pero los valores que devuelven se basan en operaciones de comparación.
Puedes usar expresiones numéricas o de cadena como argumentos para las funciones de comparación. (Las constantes de cadena deben ir entre comillas simples o dobles). Las expresiones pueden ser literales o valores recuperados por una consulta. Normalmente, las funciones de comparación se usan como condiciones de filtro en cláusulas WHERE
, aunque también 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 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 , ambos incluidos. |
expr IS NULL |
Devuelve true si expr es NULL. |
expr IN() |
Devuelve true si expr coincide con
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: usa expr IS NOT NULL en su lugar. |
LEAST() |
Devuelve el parámetro numeric_expr más pequeño. |
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 queexpr2
. expr1 <= expr2
- devuelve
true
siexpr1
es menor o igual queexpr2
. expr1 BETWEEN expr2 AND expr3
-
Devuelve
true
si el valor deexpr1
es mayor o igual queexpr2
y menor o igual queexpr3
. expr IS NULL
- devuelve
true
siexpr
es NULL. expr IN(expr1, expr2, ...)
- Devuelve
true
siexpr
coincide conexpr1
,expr2
o cualquier valor entre paréntesis. La palabra claveIN
es una abreviatura eficiente de(expr = expr1 || expr = expr2 || ...)
. Las expresiones que se usan 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 combinaciones semi-joins y anti-joins. Para obtener más información, consulta Semi-join y Anti-join. COALESCE(<expr1>, <expr2>, ...)
- Devuelve el primer argumento que no es NULL.
GREATEST(numeric_expr1, numeric_expr2, ...)
-
Devuelve el parámetro
numeric_expr
más grande. Todos los parámetros deben ser numéricos y del mismo tipo. Si algún parámetro esNULL
, esta función devuelveNULL
.Para ignorar los valores
NULL
, usa la funciónIFNULL
para cambiar los valoresNULL
por un valor que no afecte a la comparación. En el siguiente ejemplo de código, se usa la funciónIFNULL
para cambiar los valores deNULL
a-1
, lo que no afecta a 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 infinito positivo o negativo. IS_NAN(numeric_expr)
- Devuelve
true
sinumeric_expr
es el valor numérico especialNaN
. IS_EXPLICITLY_DEFINED(expr)
-
Esta función ya no está disponible. En su lugar, usa
expr IS NOT NULL
. LEAST(numeric_expr1, numeric_expr2, ...)
-
Devuelve el parámetro
numeric_expr
más pequeño. Todos los parámetros deben ser numéricos y 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 deIFNULL
.
Funciones de fecha y hora
Las siguientes funciones permiten manipular fechas y horas de marcas de tiempo UNIX, cadenas de fecha y tipos de datos TIMESTAMP. Para obtener más información sobre cómo trabajar con el tipo de datos TIMESTAMP, consulta Usar TIMESTAMP.
Las funciones de fecha y hora que funcionan con marcas de tiempo UNIX operan con hora UNIX. Las funciones de fecha y hora devuelven valores basados en la zona horaria UTC.
Sintaxis
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() |
Añade 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 número entero entre 1 y 31. |
DAYOFWEEK() |
Devuelve el día de la semana como un número entero entre 1 (domingo) y 7 (sábado). |
DAYOFYEAR() |
Devuelve el día del año como un número 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 un número entero entre 0 y 23. |
MINUTE() |
Devuelve los minutos de una MARCA_DE_TIEMPO como un número entero entre 0 y 59. |
MONTH() |
Devuelve el mes de una marca de tiempo como un número entero entre 1 y 12. |
MSEC_TO_TIMESTAMP() |
Convierte una marca de tiempo UNIX en milisegundos en un valor 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 una marca de tiempo como un número entero entre 1 y 4. |
SEC_TO_TIMESTAMP() |
Convierte una marca de tiempo UNIX en segundos en un valor TIMESTAMP. |
SECOND() |
Devuelve los segundos de una marca de tiempo como un número entero entre 0 y 59. |
STRFTIME_UTC_USEC() |
Devuelve una cadena de fecha con el formato date_format_str. |
TIME() |
Devuelve una marca de tiempo en el formato %H:%M:%S . |
TIMESTAMP() |
Convierte una cadena de fecha en una marca de tiempo. |
TIMESTAMP_TO_MSEC() |
Convierte un valor de TIMESTAMP en una marca de tiempo UNIX en milisegundos. |
TIMESTAMP_TO_SEC() |
Convierte un valor de TIMESTAMP en una marca de tiempo UNIX en segundos. |
TIMESTAMP_TO_USEC() |
Convierte un valor de TIMESTAMP en una marca de tiempo UNIX en microsegundos. |
USEC_TO_TIMESTAMP() |
Convierte una marca de tiempo UNIX en microsegundos en un valor TIMESTAMP. |
UTC_USEC_TO_DAY() |
Cambia una marca de tiempo UNIX en microsegundos al principio del día en el que se produce. |
UTC_USEC_TO_HOUR() |
Cambia una marca de tiempo UNIX en microsegundos al principio de la hora en la que se produce. |
UTC_USEC_TO_MONTH() |
Desplaza una marca de tiempo UNIX en microsegundos al principio del mes en el que se produce. |
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 una marca de tiempo como un número 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();
Devuelve: 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();
Devoluciones: 01:32:56
CURRENT_TIMESTAMP()
Devuelve un tipo de datos TIMESTAMP de la hora 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 TIMESTAMP con el formato
%Y-%m-%d
.Ejemplo:
SELECT DATE(TIMESTAMP('2012-10-01 02:03:04'));
Devuelve: 2012-10-01
DATE_ADD(<timestamp>,<interval>,
<interval_units>)Añade el intervalo especificado a un tipo de datos TIMESTAMP. Entre los valores posibles de
interval_units
se incluyenYEAR
,MONTH
,DAY
,HOUR
,MINUTE
ySECOND
. Siinterval
es un número negativo, el intervalo se resta del tipo de datos TIMESTAMP.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");
Devuelve: 2007-10-01 02:03:04 UTC
DATEDIFF(<timestamp1>,<timestamp2>)
Devuelve el número de días entre dos tipos de datos TIMESTAMP. El resultado es positivo si el primer tipo de datos TIMESTAMP es posterior al segundo tipo de datos TIMESTAMP. 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 TIMESTAMP como un número entero entre 1 y 31, ambos incluidos.
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 TIMESTAMP como un número entero entre 1 (domingo) y 7 (sábado), ambos incluidos.
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 TIMESTAMP como un número entero entre 1 y 366, ambos incluidos. El número entero 1 hace referencia 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 de UNIX con 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 TIMESTAMP como un número entero entre 0 y 23, ambos incluidos.
Ejemplo:
SELECT HOUR(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 5
MINUTE(<timestamp>)
Devuelve los minutos de un tipo de datos TIMESTAMP como un número entero entre 0 y 59, ambos inclusive.
Ejemplo:
SELECT MINUTE(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 23
MONTH(<timestamp>)
Devuelve el mes de un tipo de datos TIMESTAMP como un número entero entre 1 y 12, ambos incluidos.
Ejemplo:
SELECT MONTH(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 10
MSEC_TO_TIMESTAMP(<expr>)
- Convierte una marca de tiempo UNIX en milisegundos en un tipo de datos TIMESTAMP.
Ejemplo:
SELECT MSEC_TO_TIMESTAMP(1349053323000);
Devoluciones: 2012-10-01 01:02:03 UTC
SELECT MSEC_TO_TIMESTAMP(1349053323000 + 1000)
Devuelve: 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 fraccionaria del segundo puede tener un máximo de seis dígitos de longitud o se puede omitir.TIMESTAMP_TO_USEC es una función equivalente que convierte un argumento de tipo de datos TIMESTAMP 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 TIMESTAMP como un número entero entre 1 y 4, ambos incluidos.
Ejemplo:
SELECT QUARTER(TIMESTAMP("2012-10-01 02:03:04"));
Devoluciones: 4
SEC_TO_TIMESTAMP(<expr>)
Convierte una marca de tiempo UNIX en segundos en un tipo de datos TIMESTAMP.
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 TIMESTAMP como un número entero entre 0 y 59, ambos inclusive.
Durante un segundo bisiesto, el intervalo de números enteros es de 0 a 60, ambos incluidos.
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 por humanos con 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).
Usa las funciones
UTC_USEC_TO_<function_name>
si tienes previsto agrupar los datos de las consultas por intervalos de tiempo (por ejemplo, para obtener todos los datos de un mes determinado), ya que estas 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 TIMESTAMP con el formato
%H:%M:%S
.Ejemplo:
SELECT TIME(TIMESTAMP('2012-10-01 02:03:04'));
Devoluciones: 02:03:04
TIMESTAMP(<date_string>)
Convierte una cadena de fecha en un tipo de datos TIMESTAMP.
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 TIMESTAMP 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 TIMESTAMP 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 TIMESTAMP.
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 en un tipo de datos TIMESTAMP.
Ejemplo:
SELECT USEC_TO_TIMESTAMP(1349053323000000);
Devoluciones: 2012-10-01 01:02:03 UTC
SELECT USEC_TO_TIMESTAMP(1349053323000000 + 1000000)
Devuelve: 2012-10-01 01:02:04 UTC
UTC_USEC_TO_DAY(<unix_timestamp>)
-
Cambia una marca de tiempo UNIX en microsegundos al principio del día en el que se produce.
Por ejemplo, si
unix_timestamp
se produce el 19 de mayo a las 08:58, esta función devuelve una marca de tiempo UNIX del 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 principio de la hora en la que se produce.
Por ejemplo, si
unix_timestamp
se produce a las 08:58, esta función devuelve una marca de tiempo de UNIX para las 08:00 del mismo día.Ejemplo:
SELECT UTC_USEC_TO_HOUR(1274259481071200);
Devolución: 1274256000000000
UTC_USEC_TO_MONTH(<unix_timestamp>)
-
Desplaza una marca de tiempo UNIX en microsegundos al principio del mes en el que se produce.
Por ejemplo, si
unix_timestamp
se produce el 19 de marzo, esta función devuelve una marca de tiempo UNIX del 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 de la semana del argumento
unix_timestamp
. Esta función utiliza dos argumentos: una marca de tiempo de Unix en microsegundos y un día de la semana del 0 (domingo) al 6 (sábado).Por ejemplo, si
unix_timestamp
se produce el viernes 11 de abril del 2008 y asigna el valor 2 (martes) aday_of_week
, la función devuelve una marca de tiempo UNIX correspondiente al martes 8 de abril del 2008.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
se produce en el 2010, la función devuelve1274259481071200
, la representación en 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 TIMESTAMP como un número entero entre 1 y 53, ambos incluidos.
Las semanas empiezan el domingo, por lo que, si el 1 de enero cae en un día que no sea domingo, la semana 1 tendrá menos de 7 días y el primer domingo del año será 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 TIMESTAMP.
Ejemplo:
SELECT YEAR(TIMESTAMP('2012-10-02 05:23:48'));
Devoluciones: 2012
Ejemplos avanzados
-
Convertir los resultados de marcas de tiempo de números enteros en un formato legible
La siguiente consulta busca los cinco momentos en los que se han producido más revisiones en Wikipedia. Para mostrar los resultados en un formato legible, usa la función
FORMAT_UTC_USEC()
de BigQuery, que toma una marca de tiempo en microsegundos como entrada. Esta consulta multiplica las marcas de tiempo en formato POSIX de Wikipedia (en segundos) por 1.000.000 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];
Devuelve:
+----------------------------+----------------+ | 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 | +----------------------------+----------------+
-
Agrupar resultados por marca de tiempo
Es útil usar funciones de fecha y hora para agrupar los resultados de las consultas en contenedores correspondientes a años, meses o días concretos. En el siguiente ejemplo se usa la función
UTC_USEC_TO_MONTH()
para mostrar cuántos caracteres usa cada colaborador de Wikipedia en sus comentarios de revisión al 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;
Devoluciones (truncadas):
+--------------------------------+---------+-----------------------+ | 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 de IP
Las funciones de IP convierten direcciones IP a un formato legible para los humanos y viceversa.
Sintaxis
Funciones de IP | |
---|---|
FORMAT_IP() |
Convierte los 32 bits menos significativos de integer_value en una cadena de dirección IPv4 legible. |
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 en 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. |
FORMAT_IP(integer_value)
- Convierte los 32 bits menos significativos de
integer_value
en una cadena de dirección IPv4 legible. Por ejemplo,FORMAT_IP(1)
devolverá la cadena'0.0.0.1'
. PARSE_IP(readable_ip)
- Convierte una cadena que representa una dirección IPv4 en un valor entero sin signo. Por ejemplo,
PARSE_IP('0.0.0.1')
devolverá1
. Si la cadena no es una dirección IPv4 válida,PARSE_IP
devolveráNULL
.
BigQuery admite la escritura de direcciones IPv4 e IPv6 en cadenas empaquetadas, como datos binarios de 4 o 16 bytes en orden de bytes de red. Las funciones descritas a continuación permiten analizar las direcciones en formato legible para humanos y viceversa. Estas funciones solo funcionan en campos de cadena con IPs.
Sintaxis
FORMAT_PACKED_IP(packed_ip)
Devuelve una dirección IP legible por humanos con el formato
10.1.5.23
o2620:0:1009:1:216:36ff:feef:3f
. Ejemplos:-
FORMAT_PACKED_IP('0123456789@ABCDE')
devoluciones'3031:3233:3435:3637:3839:4041:4243:4445'
FORMAT_PACKED_IP('0123')
devoluciones'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')
devoluciones'MDEyMw=='
PARSE_PACKED_IP('3031:3233:3435:3637:3839:4041:4243:4445')
devoluciones'MDEyMzQ1Njc4OUBBQkNERQ=='
Funciones JSON
Las funciones JSON de BigQuery te permiten encontrar valores en los datos JSON almacenados mediante expresiones similares a JSONPath.
Almacenar datos JSON puede ser más flexible que declarar todos los campos individuales en el esquema de la tabla, pero puede conllevar costes más elevados. Cuando seleccionas datos de una cadena JSON, se te cobra por analizar toda la cadena, lo que resulta más caro que si cada campo estuviera en una columna independiente. La consulta también es más lenta, ya que toda la cadena debe analizarse en el momento de la consulta. Sin embargo, en el caso de los esquemas ad hoc o que cambian rápidamente, la flexibilidad de JSON puede merecer la pena a pesar del coste adicional.
Si trabajas con datos estructurados, usa funciones JSON en lugar de funciones de expresiones regulares de BigQuery, ya que las funciones JSON son más fáciles de usar.
Sintaxis
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. |
JSON_EXTRACT(json, json_path)
-
Selecciona un valor en
json
según 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
según la expresión JSONPathjson_path
.json_path
debe ser una constante de cadena. Devuelve un valor JSON escalar.
Operadores lógicos
Los operadores lógicos aplican la lógica binaria o ternaria en expresiones. La lógica binaria devuelve true
o false
. La lógica ternaria admite 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 si una expresión se cumple 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 si una expresión no se cumple y la otra es NULA.
- Devuelve
NOT expr
- Devuelve
true
si la expresión es falsa. - Devuelve
false
si la expresión es verdadera. - Devuelve
NULL
si la expresión es NULA.
Puedes usar
NOT
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 usan argumentos numéricos y devuelven un resultado numérico. Cada argumento puede ser un literal numérico o un valor numérico devuelto por una consulta. Si la función matemática da como resultado un valor indefinido, la operación devuelve NULL
.
Sintaxis
Funciones matemáticas | |
---|---|
ABS() |
Devuelve el valor absoluto del argumento. |
ACOS() |
Devuelve el arcocoseno del argumento. |
ACOSH() |
Devuelve el arco coseno hiperbólico del argumento. |
ASIN() |
Devuelve el arcoseno del argumento. |
ASINH() |
Devuelve el arcoseno hiperbólico del argumento. |
ATAN() |
Devuelve la arcotangente del argumento. |
ATANH() |
Devuelve la tangente hiperbólica inversa del argumento. |
ATAN2() |
Devuelve la arcotangente de los dos argumentos. |
CEIL() |
Redondea el argumento al número entero más próximo y devuelve el valor redondeado. |
COS() |
Devuelve el coseno del argumento. |
COSH() |
Devuelve el coseno hiperbólico del argumento. |
DEGREES() |
Convierte radianes en grados. |
EXP() |
Devuelve e elevado a la potencia del argumento. |
FLOOR() |
Redondea el argumento hacia abajo al número entero más próximo. |
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. |
RADIANS() |
Convierte grados en radianes. |
RAND() |
Devuelve un valor flotante aleatorio en el intervalo 0,0 <= valor < 1,0. |
ROUND() |
Redondea el argumento hacia arriba o hacia abajo al número entero más próximo. |
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 arcocoseno del argumento.
ACOSH(numeric_expr)
- Devuelve el coseno hiperbólico inverso del argumento.
ASIN(numeric_expr)
- Devuelve el arcoseno del argumento.
ASINH(numeric_expr)
- Devuelve el seno hiperbólico inverso del argumento.
ATAN(numeric_expr)
- Devuelve la arcotangente del argumento.
ATANH(numeric_expr)
- Devuelve la tangente hiperbólica inversa del argumento.
ATAN2(numeric_expr1, numeric_expr2)
- Devuelve la arcotangente de los dos argumentos.
CEIL(numeric_expr)
- Redondea el argumento al número entero más próximo 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) a la potencia de numeric_expr.
FLOOR(numeric_expr)
- Redondea el argumento al número entero inferior más próximo y devuelve el valor redondeado.
LN(numeric_expr)
LOG(numeric_expr)
- Devuelve el logaritmo natural del argumento.
LOG2(numeric_expr)
- Devuelve el logaritmo en base 2 del argumento.
LOG10(numeric_expr)
- Devuelve el logaritmo en base 10 del argumento.
PI()
- Devuelve la constante π. La función
PI()
requiere paréntesis para indicar que es una función, pero no incluye ningún argumento entre ellos. Puedes usarPI()
como una constante con funciones matemáticas y aritméticas. POW(numeric_expr1, numeric_expr2)
- Devuelve el resultado de elevar
numeric_expr1
a la potencia denumeric_expr2
. RADIANS(numeric_expr)
- Devuelve
numeric_expr
, convertido de grados a radianes. (Ten en cuenta que π radianes equivalen a 180 grados). RAND([int32_seed])
- Devuelve un valor flotante aleatorio en el intervalo 0,0 <= valor < 1,0. Cada valor de
int32_seed
siempre genera la misma secuencia de números aleatorios en una consulta determinada, siempre que no uses una cláusulaLIMIT
. Si no se especificaint32_seed
, BigQuery usa la marca de tiempo actual como valor de semilla. ROUND(numeric_expr [, digits])
- Redondea el argumento hacia arriba o hacia abajo al número entero más próximo (o, si se especifica, al número de decimales indicado) 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 cuadro delimitador
La siguiente consulta devuelve una colección de puntos dentro de un cuadro delimitador rectangular centrado en 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 envolvente aproximado
Devuelve una colección de hasta 100 puntos dentro de un círculo aproximado determinado por la mediante la ley esférica del coseno, centrado en Denver, Colorado (39,73, -104,98). Esta consulta usa funciones matemáticas y trigonométricas de BigQuery, como
PI()
,SIN()
yCOS()
.Como la Tierra no es una esfera perfecta y la longitud y la latitud convergen 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 ofrece compatibilidad con expresiones regulares mediante la biblioteca re2. Consulta la documentación de la sintaxis de expresiones regulares.
Ten en cuenta que las expresiones regulares son coincidencias globales; para iniciar la coincidencia al principio de una palabra, usa el carácter ^.
Sintaxis
Funciones de expresión regular | |
---|---|
REGEXP_MATCH() |
Devuelve "true" si el argumento coincide con la expresión regular. |
REGEXP_EXTRACT() |
Devuelve la parte del argumento que coincide con el grupo de captura de la expresión regular. |
REGEXP_REPLACE() |
Sustituye una subcadena que coincide con una expresión regular. |
REGEXP_MATCH('str', 'reg_exp')
Devuelve "true" si str coincide con la expresión regular. Para buscar coincidencias de cadenas sin expresiones regulares, utilice CONTAINS 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;
Devuelve:
+-------+-------+ | 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 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;
Devuelve:
+----------+ | fragment | +----------+ | NULL | | Al'ce | | As'es | +----------+
REGEXP_REPLACE('orig_str', 'reg_exp', 'replace_str')
Devuelve una cadena en la que las subcadenas de orig_str que coincidan con reg_exp se sustituyen por replace_str. Por ejemplo, REGEXP_REPLACE ('Hello', 'lo', 'p') devuelve "Help".
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;
Devuelve:
+---------------+ | expanded_word | +---------------+ | Whenever | | never | | nevertheless | | whenever | +---------------+
Ejemplos avanzados
-
Filtrar el conjunto de resultados por coincidencia de expresiones regulares
Las funciones de expresiones regulares de BigQuery se pueden usar para filtrar resultados en una cláusula
WHERE
, así como para mostrar resultados en laSELECT
. En el siguiente ejemplo se combinan ambos casos prácticos de expresiones regulares 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);
-
Usar expresiones regulares en datos de tipo entero o flotante
Aunque las funciones de expresiones regulares de BigQuery solo funcionan con datos de cadena, se puede usar la función
STRING()
para convertir datos de números enteros o de coma flotante en formato de cadena. En este ejemplo,STRING()
se usa para convertir el valor enterocorpus_date
en una cadena, que luego se modifica conREGEXP_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 ir entre comillas simples o dobles. Las funciones de cadena distinguen entre mayúsculas y minúsculas de forma predeterminada.
Puedes añadir IGNORE CASE
al final de una consulta para habilitar la coincidencia que no distingue entre mayúsculas y minúsculas. IGNORE CASE
solo funciona con caracteres ASCII
y solo en el nivel superior de la consulta.
Estas funciones no admiten comodines. Para usar expresiones regulares, consulta las funciones de expresiones regulares.
Sintaxis
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 de base uno de la primera aparición de una cadena. |
LEFT() |
Devuelve los caracteres situados 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úscula. |
LPAD() |
Inserta caracteres a la izquierda de una cadena. |
LTRIM() |
Quita caracteres de la parte izquierda de una cadena. |
REPLACE() |
Sustituye todas las repeticiones de una subcadena. |
RIGHT() |
Devuelve los caracteres situados más a la derecha de una cadena. |
RPAD() |
Inserta caracteres en el lado derecho de una cadena. |
RTRIM() |
Quita los caracteres finales de la parte derecha 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úscula. |
CONCAT('str1', 'str2', '...')
str1 + str2 + ...- Devuelve la concatenación de dos o más cadenas, o NULL si alguno de los valores es NULL. Ejemplo: si
str1
esJava
ystr2
esScript
,CONCAT
devuelveJavaScript
. expr CONTAINS 'str'
- devuelve
true
siexpr
contiene el argumento de cadena especificado. Esta comparación distingue entre mayúsculas y minúsculas. INSTR('str1', 'str2')
- Devuelve el índice basado en uno de la primera aparición de str2 en str1 o devuelve 0 si str2 no aparece en str1.
LEFT('str', numeric_expr)
- Devuelve los numeric_expr caracteres situados más a la izquierda de
str
. Si el número es mayor que str, se devolverá la cadena completa. Ejemplo:LEFT('seattle', 3)
devuelvesea
. LENGTH('str')
- Devuelve un valor numérico de la longitud de la cadena. Ejemplo: si
str
es'123456'
,LENGTH
devuelve6
. LOWER('str')
- Devuelve la cadena original con todos los caracteres en minúsculas.
LPAD('str1', numeric_expr, 'str2')
Rellena str1
por la izquierda constr2
, repitiendostr2
hasta que la cadena resultante tenga exactamentenumeric_expr
caracteres. Ejemplo:LPAD('1', 7, '?')
devuelve??????1
.LTRIM('str1' [, str2])
-
Quita caracteres de la parte izquierda de str1. Si se omite str2,
LTRIM
elimina los espacios de la parte izquierda de str1. De lo contrario,LTRIM
elimina cualquier carácter de str2 de la parte izquierda de str1 (distingue entre mayúsculas y minúsculas).Ejemplos:
SELECT LTRIM("Say hello", "yaS")
devuelve" hello"
.SELECT LTRIM("Say hello", " ySa")
devuelve"hello"
. REPLACE('str1', 'str2', 'str3')
-
Sustituye todas las instancias de str2 en str1 por str3.
RIGHT('str', numeric_expr)
- Devuelve los numeric_expr caracteres situados más a la derecha de
str
. Si el número es mayor que la cadena, se devuelve la cadena completa. Ejemplo:RIGHT('kirkland', 4)
devuelveland
. RPAD('str1', numeric_expr, 'str2')
Rellena - Ejemplo:
RPAD('1', 7, '?')
devuelve1??????
. RTRIM('str1' [, str2])
-
Quita los caracteres finales de la parte derecha de str1. Si se omite str2,
RTRIM
elimina los espacios finales de str1. De lo contrario,RTRIM
elimina los caracteres de str2 de la parte derecha de str1 (distingue entre mayúsculas y minúsculas).Ejemplos:
SELECT RTRIM("Say hello", "leo")
devuelve"Say h"
.SELECT RTRIM("Say hello ", " hloe")
devuelve"Say"
. SPLIT('str' [, 'delimiter'])
- Divide una cadena en subcadenas repetidas. Si se especifica
delimiter
, la funciónSPLIT
dividestr
en subcadenas usandodelimiter
como delimitador. SUBSTR('str', index [, max_len])
- Devuelve una subcadena de
str
, que empieza enindex
. Si se usa el parámetro opcionalmax_len
, la cadena devuelta tendrá una longitud máxima demax_len
caracteres. El recuento empieza en uno, de manera que el primer carácter de la cadena está en la posición uno (no cero). Siindex
es5
, la subcadena empieza por el quinto carácter destr
contando desde la izquierda. Siindex
es-4
, la subcadena empieza por el cuarto carácter destr
contando desde la derecha. Ejemplo:SUBSTR('awesome', -4, 4)
devuelve la subcadenasome
. UPPER('str')
- Devuelve la cadena original con todos los caracteres en mayúsculas.
str1
por la derecha con str2
, repitiendo str2
hasta que la cadena resultante tenga exactamente numeric_expr
caracteres.Caracteres especiales en cadenas
Para añadir secuencias de escape a caracteres especiales, usa uno de los métodos siguientes:
- Usa la notación
'\xDD'
, donde'\x'
va seguido de la representación hexadecimal de dos dígitos del carácter. - Usa una barra diagonal de escape delante de barras diagonales, de comillas simples y de comillas dobles.
- Usa secuencias de estilo C (
'\a', '\b', '\f', '\n', '\r', '\t',
y'\v'
) para otros caracteres.
Algunos ejemplos de secuencias de escape:
'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 de comodín de tabla
Las funciones comodín de tabla son una forma cómoda de consultar datos de un conjunto específico de tablas. Una función de comodín de tabla equivale a una unión separada por comas de todas las tablas que coinciden con la función de comodín. Cuando usas una función comodín de tabla, BigQuery solo accede a las tablas que coinciden con el comodín y te cobra por ellas. Las funciones de comodín de tabla se especifican en la cláusula FROM de la consulta.
Si usa funciones de comodín de tabla en una consulta, ya no es necesario que las incluya entre paréntesis. Por ejemplo, algunos de los siguientes ejemplos usan paréntesis, mientras que otros no.
Los resultados almacenados en caché no pueden utilizarse en las consultas de varias tablas con una función de comodín (aunque esté marcada la opción Utilizar los resultados almacenados en caché). Si realiza varias veces la misma consulta con comodín, se le facturará cada una de ellas.
Sintaxis
Funciones de comodín de tabla | |
---|---|
TABLE_DATE_RANGE() |
Consulta varias tablas diarias que abarcan un periodo. |
TABLE_DATE_RANGE_STRICT() |
Consulta varias tablas diarias que abarcan un intervalo de fechas sin que falte ninguna. |
TABLE_QUERY() |
Consulta las tablas cuyos nombres coinciden con un predicado especificado. |
TABLE_DATE_RANGE(prefix, timestamp1, timestamp2)
-
Consulta las tablas diarias que se solapan con el periodo comprendido entre
<timestamp1>
y<timestamp2>
.Los nombres de las tablas deben tener el siguiente formato:
<prefix><day>
, donde<day>
tiene el formatoYYYYMMDD
.Puedes usar funciones de fecha y hora para generar los parámetros de marca de tiempo. Por ejemplo:
TIMESTAMP('2012-10-01 02:03:04')
DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')
Ejemplo: obtener tablas entre dos días
En este ejemplo, se presupone que existen las siguientes tablas:
- 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
Coincide con las siguientes tablas:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
Ejemplo: obtener tablas de un periodo de dos días hasta "ahora"
En este ejemplo, se presupone que existen las siguientes tablas en un proyecto llamado
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
Coincide con las siguientes tablas:
- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
TABLE_DATE_RANGE_STRICT(prefix, timestamp1, timestamp2)
-
Esta función equivale a
TABLE_DATE_RANGE
. La única diferencia es que, si falta alguna tabla diaria en la secuencia,TABLE_DATE_RANGE_STRICT
falla y devuelve un errorNot Found: Table <table_name>
.Ejemplo: error en una tabla que falta
En este ejemplo, se presupone que existen las siguientes tablas:
- 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
En el ejemplo anterior, se devuelve el error "Not Found" (No encontrado) para la tabla "people20140326".
TABLE_QUERY(dataset, expr)
-
Consulta las tablas cuyos nombres coincidan con el
expr
proporcionado. El parámetroexpr
debe representarse como una cadena y debe contener una expresión que se va a evaluar. Por ejemplo,'length(table_id) < 3'
.Ejemplo: buscar tablas cuyos nombres contengan "oo" y tengan una longitud superior a 4
En este ejemplo, se presupone que existen las siguientes tablas:
- 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'))
Coincide con las siguientes tablas:
- mydata.ooze
- mydata.spoon
Ejemplo: busca tablas cuyos nombres empiecen por "boo" y tengan entre 3 y 5 dígitos numéricos
En este ejemplo, se presupone que existen las siguientes tablas en un proyecto llamado
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}")')
Coincide con las siguientes tablas:
- mydata.book418
- mydata.boom12345
Funciones de URL
Sintaxis
Funciones de URL | |
---|---|
HOST() |
Dada una URL, devuelve el nombre de host como cadena. |
DOMAIN() |
Dada una URL, devuelve el dominio como cadena. |
TLD() |
Dada una URL, devuelve el dominio de nivel superior más cualquier dominio de país de la URL. |
HOST('url_str')
- Dada una URL, devuelve el nombre de host como una cadena. Ejemplo: HOST('http://www.google.com:80/index.html') devuelve 'www.google.com'.
DOMAIN('url_str')
- Dada una URL, devuelve el dominio como una cadena. Ejemplo: DOMAIN('http://www.google.com:80/index.html') devuelve 'google.com'.
TLD('url_str')
- Dada una URL, devuelve el dominio de nivel superior más cualquier dominio de país de la URL. Ejemplo: TLD('http://www.google.com:80/index.html') devuelve '.com'. TLD('http://www.google.co.uk:80/index.html') devuelve ".co.uk".
Notas:
- Estas funciones no realizan búsquedas inversas de DNS, por lo que, si las llamas con una dirección IP, devolverán segmentos de la dirección IP en lugar de segmentos del nombre de host.
- Todas las funciones de análisis de URLs esperan caracteres en minúsculas. Si la URL contiene caracteres en mayúsculas, el resultado será NULL o incorrecto. Si tus datos tienen una combinación de mayúsculas y minúsculas, te recomendamos que pases la entrada a esta función a través de LOWER().
Ejemplo avanzado
Analizar nombres de dominio a partir de datos de URL
Esta consulta usa la función
DOMAIN()
para devolver los dominios más populares que aparecen como páginas principales de repositorios en GitHub. Observa el uso de HAVING para filtrar registros mediante el resultado de la función DOMAIN()
. Esta función es útil para determinar la información de la referente a partir de los datos de la URL.
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;
Devuelve:
+-----------------+----------------+ | user_domain | activity_count | +-----------------+----------------+ | github.com | 281879 | | google.com | 34769 | | khanacademy.org | 17316 | | sourceforge.net | 15103 | | mozilla.org | 14091 | +-----------------+----------------+
Para consultar información específica sobre TLDs, usa la función TLD()
. En este ejemplo se muestran los TLDs principales que no están en una lista de ejemplos comunes.
#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;
Devuelve:
+----------+----------------+ | user_tld | activity_count | +----------+----------------+ | .de | 22934 | | .io | 17528 | | .me | 13652 | | .fr | 12895 | | .co.uk | 9135 | +----------+----------------+
Funciones de ventana
Las funciones de ventana, también conocidas como funciones analíticas, permiten hacer cálculos en un subconjunto específico, o "ventana", de un conjunto de resultados. Las funciones de ventana facilitan la creación de informes que incluyen analíticas complejas, como medias móviles y totales acumulados.
Cada función de ventana requiere una cláusula OVER
que especifique la parte superior e inferior de la ventana. Los tres componentes de la cláusula OVER
(partición, orden y marco) proporcionan un control adicional
sobre la ventana. La partición te permite dividir los datos de entrada en grupos lógicos que tienen una característica común. El orden te permite ordenar los resultados de una partición. El encuadre te permite crear un marco de ventana deslizante dentro de una partición que se mueve en relación con la fila actual. Puedes configurar el tamaño del marco de la ventana móvil
en función de un número de filas o de un intervalo de valores, como un intervalo de tiempo.
#legacySQL SELECT <window_function> OVER ( [PARTITION BY <expr>] [ORDER BY <expr> [ASC | DESC]] [<window-frame-clause>] )
PARTITION BY
- Define la partición base sobre la que opera esta función.
Especifica uno o varios nombres de columna separados por comas. Se creará una partición por cada conjunto de valores distintos de estas columnas, de forma similar a una cláusula
GROUP BY
. Si se omitePARTITION BY
, la partición base serán todas las filas de la entrada de la función de ventana. - La cláusula
PARTITION BY
también permite que las funciones de ventana particionen los datos y paralelice la ejecución. Si quieres usar una función de ventana conallowLargeResults
o aplicar más combinaciones o agregaciones al resultado de tu función de ventana, usaPARTITION BY
para paralelizar la ejecución.
Las cláusulas JOIN EACH
yGROUP EACH BY
no se pueden usar en el resultado de las funciones de ventana. Para generar resultados de consultas grandes al usar funciones de ventana, debes usarPARTITION BY
.ORDER BY
- Ordena la partición. Si no se incluye
ORDER BY
, no se garantiza ningún orden de clasificación predeterminado. La ordenación se produce a nivel de partición, antes de que se aplique cualquier cláusula de marco de ventana. Si especificas una ventanaRANGE
, debes añadir una cláusulaORDER BY
. El orden predeterminado esASC
. ORDER BY
es opcional en algunos casos, pero ciertas funciones de ventana, como rank() o dense_rank(), requieren la cláusula.- Si usas
ORDER BY
sin especificarROWS
niRANGE
,ORDER BY
implica que la ventana se extiende desde el principio de la partición hasta la fila actual. Si no hay ninguna cláusulaORDER BY
, la ventana es toda la partición. <window-frame-clause>
-
{ROWS | RANGE} {BETWEEN <start> AND <end> | <start> | <end>}
- Un subconjunto de la partición sobre la que se va a operar. Puede ser del mismo tamaño que la partición o más pequeño. Si usas
ORDER BY
sinwindow-frame-clause
, el marco de la ventana predeterminado esRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. Si omites tantoORDER BY
comowindow-frame-clause
, el marco de ventana predeterminado será toda la partición.ROWS
: define una ventana en términos de posición de la fila, en relación con la fila actual. Por ejemplo, para añadir una columna que muestre la suma de los 5 valores de salario anteriores, consultaríasSUM(salary) OVER (ROWS BETWEEN 5 PRECEDING AND CURRENT ROW)
. El conjunto de filas suele incluir la fila actual, pero no es obligatorio.RANGE
: define una ventana en términos de un intervalo de valores de una columna determinada, en relación con el valor de esa columna en la fila actual. Solo funciona con números y fechas, donde los valores de fecha son números enteros simples (microsegundos desde el inicio del registro de tiempo). Las filas adyacentes con el mismo valor se denominan filas del mismo nivel. Las filas de elementos del mismo nivel deCURRENT ROW
se incluyen en un marco de ventana que especificaCURRENT ROW
. Por ejemplo, si especifica que el final de la ventana seaCURRENT ROW
y la fila siguiente de la ventana tenga el mismo valor, se incluirá en el cálculo de la función.BETWEEN <start> AND <end>
: un intervalo que incluye las filas inicial y final. El intervalo no tiene por qué incluir la fila actual, pero<start>
debe ser anterior o igual a<end>
.<start>
: especifica el desplazamiento inicial de esta ventana en relación con la fila actual. Se admiten las siguientes opciones: donde{UNBOUNDED PRECEDING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}
<expr>
es un entero positivo,PRECEDING
indica un número de fila o un valor de intervalo anterior, yFOLLOWING
indica un número de fila o un valor de intervalo posterior.UNBOUNDED PRECEDING
significa la primera fila de la partición. Si el inicio precede a la ventana, se asignará a la primera fila de la partición.<end>
: especifica el desplazamiento final de esta ventana en relación con la fila actual. Se admiten las siguientes opciones: donde{UNBOUNDED FOLLOWING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}
<expr>
es un entero positivo,PRECEDING
indica un número de fila o un valor de intervalo anterior, yFOLLOWING
indica un número de fila o un valor de intervalo posterior.UNBOUNDED FOLLOWING
significa la última fila de la partición. Si end supera el final de la ventana, se asignará a la última fila de la partición.
A diferencia de las funciones de agregación, que combinan muchas filas de entrada en una fila de salida, las funciones de ventana devuelven una fila de salida por cada fila de entrada.
Esta función facilita la creación de consultas que calculan totales acumulados y medias móviles. Por ejemplo, la siguiente consulta devuelve un total acumulado de un pequeño conjunto de datos de cinco filas definido por las instrucciones SELECT
:
#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 devuelto:
+------+-------+--------------+ | name | value | RunningTotal | +------+-------+--------------+ | a | 0 | 0 | | b | 1 | 1 | | c | 2 | 3 | | d | 3 | 6 | | e | 4 | 10 | +------+-------+--------------+
En el siguiente ejemplo se calcula la media móvil de los valores de la fila actual y de la anterior. El marco de la ventana consta de dos filas que se mueven con la fila actual.
#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 devuelto:
+------+-------+---------------+ | 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() |
Es la misma operación que las funciones de agregación correspondientes, pero se calcula en una ventana definida por la cláusula OVER. |
CUME_DIST() |
Devuelve un valor de tipo double que indica la distribución acumulada de un valor en un grupo de valores. |
DENSE_RANK() |
Devuelve la clasificación entera de un valor en un grupo de valores. |
FIRST_VALUE() |
Devuelve el primer valor del campo especificado en la ventana. |
LAG() |
Te permite leer datos de una fila anterior de una ventana. |
LAST_VALUE() |
Devuelve el último valor del campo especificado en la ventana. |
LEAD() |
Te permite leer datos de una fila posterior 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 de segmentos especificado. |
PERCENT_RANK() |
Devuelve la clasificación de la fila actual en relación con las demás 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 próximo al percentil del argumento en la ventana. |
RANK() |
Devuelve la clasificación entera de un valor en un grupo de valores. |
RATIO_TO_REPORT() |
Devuelve la proporción de cada valor respecto a la suma de los valores. |
ROW_NUMBER() |
Devuelve el número de fila actual del resultado de la consulta en la ventana. |
-
AVG(numeric_expr)
COUNT(*)
COUNT([DISTINCT] field)
MAX(field)
MIN(field)
STDDEV(numeric_expr)
SUM(field)
-
Estas funciones de ventana realizan la misma operación que las
funciones de agregación correspondientes, pero se calculan
en una ventana definida por la cláusula OVER.
Otra diferencia significativa es que la función
COUNT([DISTINCT] field)
produce resultados exactos cuando se usa como función de ventana, con un comportamiento similar al de la función de agregadoEXACT_COUNT_DISTINCT()
.En la consulta de ejemplo, la cláusula
ORDER BY
hace que la ventana se calcule desde el inicio de la partición hasta la fila actual, lo que genera una suma acumulativa de ese año.#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
Devuelve:
corpus_date corpus word_count annual_total 0 various 37 37 0 sonetos 157 194 1590 2kinghenryvi 18 18 1590 1kinghenryvi 24 42 1590 3kinghenryvi 40 82 CUME_DIST()
-
Devuelve un valor double que indica la distribución acumulada de un valor en un grupo de valores, calculado mediante la fórmula
<number of rows preceding or tied with the current row> / <total rows>
. Los valores empatados devuelven el mismo valor de distribución acumulada.Esta función de ventana requiere
ORDER BY
en la cláusulaOVER
.#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
Devuelve:
word word_count 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()
-
Devuelve la clasificación entera de un valor en un grupo de valores. La clasificación se calcula en función de las comparaciones con otros valores del grupo.
Los valores empatados se muestran con el mismo rango. El rango del siguiente valor se incrementa en 1. Por ejemplo, si dos valores empatan en el segundo puesto, el siguiente valor clasificado es el tercero. Si prefieres que haya un hueco en la lista de clasificación, usa rank().
Esta función de ventana requiere
ORDER BY
en la cláusulaOVER
. Devuelve:#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
word word_count dense_rank pañuelo 29 1 satisfacción 5 2 disgusto 4 3 instrumentos 4 3 circunstancia 3 4 FIRST_VALUE(<field_name>)
-
Devuelve el primer valor de
<field_name>
de la ventana. Devuelve:#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
word word_count fv imperfectamente 1 imperfectamente LAG(<expr>[, <offset>[, <default_value>]])
-
Te permite leer datos de una fila anterior de una ventana. En concreto,
LAG()
devuelve el valor de<expr>
de la fila situada<offset>
filas antes de la fila actual. Si la fila no existe, se devuelve<default_value>
.#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
Devuelve:
word word_count lag pañuelo 29 null satisfacción 5 pañuelo disgusto 4 satisfacción instrumentos 4 disgusto circunstancia 3 instrumentos LAST_VALUE(<field_name>)
-
Devuelve el último valor de
<field_name>
en la ventana.#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
Devuelve:
word word_count lv imperfectamente 1 imperfectamente LEAD(<expr>[, <offset>[, <default_value>]])
-
Te permite leer datos de una fila posterior dentro de una ventana. En concreto,
LEAD()
devuelve el valor de<expr>
de la fila situada<offset>
filas después de la fila actual. Si la fila no existe, se devuelve<default_value>
. Devuelve:#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
word word_count lead pañuelo 29 satisfacción satisfacción 5 disgusto disgusto 4 instrumentos instrumentos 4 circunstancia circunstancia 3 null NTH_VALUE(<expr>, <n>)
-
Devuelve el valor de
<expr>
en la posición<n>
del marco de la ventana, donde<n>
es un índice basado en uno. NTILE(<num_buckets>)
-
Divide una secuencia de filas en
<num_buckets>
grupos y asigna a cada fila un número de grupo correspondiente (un número entero). La funciónntile()
asigna los números de contenedor de la forma más equitativa posible y devuelve un valor entre 1 y<num_buckets>
para cada fila. Devuelve:#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
word word_count ntile pañuelo 29 1 satisfacción 5 1 disgusto 4 1 instrumentos 4 2 circunstancia 3 2 PERCENT_RANK()
-
Devuelve la clasificación de la fila actual en relación con las demás filas de la partición. Los valores devueltos están comprendidos entre 0 y 1, ambos incluidos. El primer valor devuelto es 0,0.
Esta función de ventana requiere
ORDER BY
en la cláusulaOVER
. Devuelve:#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
word word_count p_rank 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>)
-
Devuelve un valor interpolado que se asignaría al argumento de percentil con respecto a la ventana, después de ordenarlos según la cláusula
ORDER BY
.<percentile>
debe estar entre 0 y 1.Esta función de ventana requiere
ORDER BY
en la cláusulaOVER
. Devuelve:#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
word word_count p_cont pañuelo 29 4 satisfacción 5 4 disgusto 4 4 instrumentos 4 4 circunstancia 3 4 PERCENTILE_DISC(<percentile>)
-
Devuelve el valor más próximo al percentil del argumento en la ventana.
<percentile>
debe estar entre 0 y 1.Esta función de ventana requiere
ORDER BY
en la cláusulaOVER
. Devuelve:#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
word word_count p_disc pañuelo 29 4 satisfacción 5 4 disgusto 4 4 instrumentos 4 4 circunstancia 3 4 RANK()
-
Devuelve la clasificación entera de un valor en un grupo de valores. La clasificación se calcula en función de las comparaciones con otros valores del grupo.
Los valores empatados se muestran con el mismo rango. El rango del siguiente valor se incrementa en función de cuántos valores empatados haya habido antes. Por ejemplo, si dos valores empatan en el segundo puesto, el siguiente valor clasificado es el cuarto, no el tercero. Si prefieres que no haya huecos en la lista de clasificación, usa dense_rank().
Esta función de ventana requiere
ORDER BY
en la cláusulaOVER
. Devuelve:#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
word word_count rango pañuelo 29 1 satisfacción 5 2 disgusto 4 3 instrumentos 4 3 circunstancia 3 5 RATIO_TO_REPORT(<column>)
-
Devuelve la proporción de cada valor respecto a la suma de los valores, como un valor doble entre 0 y 1.
Devuelve:#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
word word_count 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()
-
Devuelve el número de fila actual del resultado de la consulta en la ventana, empezando por 1.
Devuelve:#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
word word_count row_num 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 |
Usa CASE para elegir entre dos o más expresiones alternativas de la consulta. |
CURRENT_USER() |
Devuelve la dirección de correo del usuario que ejecuta la consulta. |
EVERY() |
Devuelve el valor "true" si el argumento es verdadero para todas sus entradas. |
FROM_BASE64() |
Convierte la cadena de entrada codificada en base64 al formato BYTES. |
HASH() |
Calcula y devuelve un valor de hash con signo de 64 bits ... |
FARM_FINGERPRINT() |
Calcula y devuelve un valor de huella digital con signo 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 del argumento, empezando por 1. |
SHA1() |
Devuelve un hash SHA1 en formato BYTES. |
SOME() |
Devuelve el valor true si el argumento es verdadero en al menos una de sus entradas. |
TO_BASE64() |
Convierte el argumento BYTES en una cadena codificada en base64. |
CASE WHEN when_expr1 THEN then_expr1
WHEN when_expr2 THEN then_expr2 ...
ELSE else_expr END- Usa CASE para elegir entre dos o más expresiones alternativas en tu consulta. Las expresiones WHEN deben ser booleanas y todas las expresiones de las cláusulas THEN y ELSE deben ser tipos compatibles.
CURRENT_USER()
- Devuelve la dirección de correo del usuario que ejecuta la consulta.
EVERY(<condition>)
- Devuelve
true
sicondition
es verdadero para todas sus entradas. Cuando se usa con la cláusulaOMIT IF
, esta función es útil para las consultas que implican campos repetidos. FROM_BASE64(<str>)
- Convierte la cadena de entrada codificada en base64
str
al formato BYTES. Para convertir BYTES en una cadena codificada en base64, usa TO_BASE64(). HASH(expr)
- Calcula y devuelve un valor de hash con signo de 64 bits de los bytes de
expr
tal como se define en la biblioteca CityHash (versión 1.0.3). Se admite cualquier expresión de cadena o de número entero, y la función respetaIGNORE CASE
en el caso de las cadenas, por lo que devuelve valores que no distinguen entre mayúsculas y minúsculas. FARM_FINGERPRINT(expr)
- Calcula y devuelve un valor de huella digital de 64 bits con signo de la entrada
STRING
oBYTES
mediante la funciónFingerprint64
de la biblioteca FarmHash de código abierto. El resultado de esta función para una entrada concreta nunca cambiará y coincide con el resultado de la funciónFARM_FINGERPRINT
cuando se usa GoogleSQL. RespetaIGNORE CASE
en las cadenas y devuelve valores que no distinguen entre mayúsculas y minúsculas. IF(condition, true_return, false_return)
- Devuelve
true_return
ofalse_return
, en función de sicondition
es verdadero o falso. Los valores devueltos pueden ser literales o valores derivados de campos, pero deben ser del mismo tipo de datos. Los valores derivados de campos no tienen que incluirse en la cláusulaSELECT
. POSITION(field)
- Devuelve la posición secuencial de campo en un conjunto de campos repetidos, empezando por 1.
SHA1(<str>)
- Devuelve un hash SHA1, en formato BYTES, de la cadena de entrada
str
. Puedes convertir el resultado a base64 con TO_BASE64(). Por ejemplo:#legacySQL SELECT TO_BASE64(SHA1(corpus)) FROM [bigquery-public-data:samples.shakespeare] LIMIT 100;
SOME(<condition>)
- Devuelve
true
sicondition
es verdadero para al menos una de sus entradas. Cuando se usa con la cláusulaOMIT IF
, esta función es útil para las consultas que incluyen campos repetidos. TO_BASE64(<bin_data>)
- Convierte la entrada BYTES
bin_data
en una cadena codificada en base64. Por ejemplo: Para convertir una cadena codificada en base64 en BYTES, usa FROM_BASE64().#legacySQL SELECT TO_BASE64(SHA1(title)) FROM [bigquery-public-data:samples.wikipedia] LIMIT 100;
Ejemplos avanzados
-
Clasificar los resultados en categorías mediante condicionales
La siguiente consulta usa un bloque
CASE/WHEN
para agrupar los resultados en categorías de "región" según una lista de estados. Si el estado no aparece como opción en una de las declaracionesWHEN
, el valor predeterminado del estado será "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;
Devuelve:
+--------+--------------------+--------------------+-------+------+ | 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 | +--------+--------------------+--------------------+-------+------+
-
Simular una tabla dinámica
Usa instrucciones condicionales para organizar los resultados de una subconsulta en filas y columnas. En el ejemplo siguiente, los resultados de una búsqueda de los artículos de Wikipedia más revisados que empiezan por el valor "Google" se organizan en columnas en las que se muestran los recuentos de revisiones si cumplen varios criterios.
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 );
Devuelve:
+---------------+--------+------+ | page_title | search | geo | +---------------+--------+------+ | Google search | 4261 | 0 | | Google Earth | 0 | 3874 | | Google Chrome | 0 | 0 | | Google Maps | 0 | 2617 | | Google bomb | 0 | 0 | +---------------+--------+------+
-
Usar HASH para seleccionar una muestra aleatoria de tus datos
Algunas consultas pueden proporcionar un resultado útil mediante un submuestreo aleatorio del conjunto de resultados. Para obtener una muestra aleatoria de valores, usa la función
HASH
para devolver resultados en los que el módulo "n" del hash sea igual a cero.Por ejemplo, la siguiente consulta buscará el
HASH()
del valor "title" y, a continuación, comprobará si ese valor módulo "2" es cero. Debería dar como resultado que aproximadamente el 50% de los valores se etiqueten como "muestreados". Para muestrear menos valores, aumenta el valor de la operación de módulo de "2" a un valor mayor. La consulta usa la funciónABS
en combinación conHASH
, ya queHASH
puede devolver valores negativos y el operador de módulo en un valor negativo da como resultado un valor negativo.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;