Sintaxe, funções e operadores do SQL antigo
Este documento detalha a sintaxe, as funções e os operadores de consultas SQL antigas. A sintaxe de consulta preferida para o BigQuery é o GoogleSQL. Para informações sobre o GoogleSQL, consulte o artigo Sintaxe de consulta do GoogleSQL.
Sintaxe de consulta
Nota: as palavras-chave não são sensíveis a maiúsculas e minúsculas. Neste documento, as palavras-chave, como SELECT
, são escritas em maiúsculas para fins ilustrativos.
Cláusula SELECT
A cláusula SELECT
especifica uma lista de expressões a calcular. As expressões na cláusula SELECT
podem conter nomes de campos, literais e chamadas de funções (incluindo funções de agregação e funções de janela), bem como combinações dos três. A lista de expressões está separada por vírgulas.
Pode atribuir um alias a cada expressão adicionando um espaço seguido de um identificador após a expressão. A palavra-chave AS
opcional pode ser adicionada entre a expressão e o alias
para melhorar a legibilidade. Os alias definidos numa cláusula SELECT
podem ser referenciados nas cláusulas GROUP BY
, HAVING
e ORDER BY
da consulta, mas não pelas cláusulas FROM
, WHERE
ou OMIT RECORD IF
, nem por outras expressões na mesma cláusula SELECT
.
Notas:
-
Se usar uma função de agregação na cláusula
SELECT
, tem de usar uma função de agregação em todas as expressões ou a sua consulta tem de ter uma cláusulaGROUP BY
que inclua todos os campos não agregados na cláusulaSELECT
como chaves de agrupamento. Por exemplo:#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. */
-
Pode usar parênteses retos para escapar a
palavras reservadas
para que as possa usar como nome de campo e alias. Por exemplo, se tiver uma coluna denominada "partition", que é uma palavra reservada na sintaxe do BigQuery, as consultas que fazem referência a esse campo falham com mensagens de erro obscuras, a menos que o interprete de forma literal com parênteses retos:
SELECT [partition] FROM ...
Exemplo
Este exemplo define aliases na cláusula SELECT
e, em seguida, faz referência a um deles na cláusula ORDER BY
. Tenha em atenção que não é possível fazer referência à coluna word através do word_alias na cláusula WHERE
. Tem de fazer referência à coluna pelo nome. O
alias len também não é visível na cláusula WHERE
. Seria visível para uma cláusula de 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 funções de agregação
aggregate_function WITHIN RECORD [ [ AS ] alias ]
A palavra-chave WITHIN
faz com que a função de agregação agregue valores repetidos em cada registo. Para cada registo de entrada, é produzido exatamente um resultado agregado. Este tipo de agregação é denominado agregação com âmbito. Uma vez que a agregação ao nível do âmbito produz resultados para cada registo, é possível selecionar expressões não agregadas juntamente com expressões agregadas ao nível do âmbito sem usar uma cláusula GROUP BY
.
Normalmente, usa o âmbito RECORD
quando usa a agregação com âmbito. Se tiver um esquema aninhado e repetido muito complexo, pode ter de fazer agregações em âmbitos de sub-registos. Isto pode ser feito substituindo a palavra-chave RECORD
na sintaxe acima pelo nome do nó no seu esquema onde quer que a agregação seja realizada.
Para mais informações sobre esse comportamento avançado, consulte o artigo
Lidar com dados.
Exemplo
Este exemplo executa uma agregação com âmbito de COUNT
e, em seguida, filtra e ordena os registos pelo 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
A cláusula FROM
especifica os dados de origem a consultar. As consultas do BigQuery podem ser executadas diretamente em tabelas, subconsultas, tabelas unidas e tabelas modificadas por operadores especiais descritos abaixo. Pode consultar combinações destas origens de dados usando a vírgula, que é o operador UNION ALL
no BigQuery.
Tabelas de referência
Quando fizer referência a uma tabela, tem de especificar datasetId e tableId; project_name é opcional. Se project_name não for especificado, o BigQuery usa o projeto atual por predefinição. Se o nome do projeto incluir um travessão, tem de colocar toda a referência da tabela entre parênteses.
Exemplo
[my-dashed-project:dataset1.tableName]
Pode atribuir um alias às tabelas adicionando um espaço seguido de um identificador após o nome da tabela. A palavra-chave AS
opcional pode ser adicionada entre o tableId e o alias para melhorar a legibilidade.
Quando faz referência a colunas de uma tabela, pode usar o nome simples da coluna ou prefixar o nome da coluna com o alias, se tiver especificado um, ou com o datasetId e o tableId, desde que não tenha sido especificado nenhum project_name. Não é possível incluir project_name no prefixo da coluna porque o caráter dois pontos não é permitido nos nomes dos campos.
Exemplos
Este exemplo faz referência a uma coluna sem prefixo de tabela.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare];
Este exemplo prefixa o nome da coluna com o datasetId e o tableId. Tenha em atenção que o project_name não pode ser incluído neste exemplo. Este método só funciona se o conjunto de dados estiver no seu projeto predefinido atual.
#legacySQL SELECT samples.shakespeare.word FROM samples.shakespeare;
Este exemplo prefixa o nome da coluna com um alias da tabela.
#legacySQL SELECT t.word FROM [bigquery-public-data:samples.shakespeare] AS t;
Tabelas particionadas por intervalo de números inteiros
O SQL antigo suporta a utilização de decoradores de tabelas para aceder a uma partição específica numa tabela particionada por intervalo de números inteiros. A chave para aceder a uma partição de intervalo é o início do intervalo.
O exemplo seguinte consulta a partição de intervalo que começa com 30:
#legacySQL SELECT * FROM dataset.table$30;
Tenha em atenção que não pode usar o SQL antigo para consultar uma tabela particionada por intervalo de números inteiros completa. Em vez disso, a consulta devolve um erro semelhante ao seguinte:
Querying tables partitioned on a field is not supported in Legacy SQL
Usar subconsultas
Uma subconsulta é uma declaração SELECT
aninhada entre parênteses. As expressões calculadas na cláusula SELECT
da subconsulta estão disponíveis para a consulta externa, tal como as colunas de uma tabela estariam disponíveis.
As subconsultas podem ser usadas para calcular agregações e outras expressões. A gama completa de operadores SQL está disponível na subconsulta. Isto significa que uma subconsulta pode conter outras subconsultas, as subconsultas podem fazer junções e agregações de agrupamento, etc.
Vírgula como UNION ALL
Ao contrário do GoogleSQL, o SQL antigo usa a vírgula como um operador UNION ALL
em vez de um operador CROSS JOIN
. Este é um comportamento antigo que evoluiu porque, historicamente, o BigQuery não suportava CROSS JOIN
e os utilizadores do BigQuery precisavam regularmente de escrever consultas UNION ALL
. No GoogleSQL, as consultas que executam uniões são particularmente detalhadas. A utilização da vírgula como operador de união permite escrever essas consultas de forma muito mais eficiente. Por exemplo, esta consulta pode ser usada para executar uma única consulta em registos de vários dias.
#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;
As consultas que unem um grande número de tabelas são normalmente executadas mais lentamente do que as consultas que processam a mesma quantidade de dados de uma única tabela. A diferença no desempenho pode ser de até 50 ms por tabela adicional. Uma única consulta pode unir, no máximo, 1000 tabelas.
Funções de carateres universais de tabelas
O termo função de carateres universais de tabela refere-se a um tipo especial de função exclusivo do BigQuery.
Estas funções são usadas na cláusula FROM
para fazer corresponder uma coleção de nomes de tabelas usando um de vários tipos de filtros. Por exemplo, a função TABLE_DATE_RANGE
pode ser usada para consultar apenas um conjunto específico de tabelas diárias. Para mais informações sobre estas funções,
consulte o artigo Funções de carateres universais de tabelas.
Operador FLATTEN
(FLATTEN([project_name:]datasetId.tableId, field_to_be_flattened)) (FLATTEN((subquery), field_to_be_flattened))
Ao contrário dos sistemas de processamento de SQL típicos, o BigQuery foi concebido para processar dados repetidos. Por este motivo, os utilizadores do BigQuery têm, por vezes, de escrever consultas que manipulam a estrutura dos registos repetidos. Uma forma de o fazer é usar o operador FLATTEN
.
FLATTEN
converte um nó no esquema de repetido para opcional. Dado um registo
com um ou mais valores para um campo repetido, FLATTEN
cria vários registos,
um para cada valor no campo repetido. Todos os outros campos selecionados do registo são duplicados
em cada novo registo de saída. FLATTEN
pode ser aplicado repetidamente para remover vários níveis de repetição.
Para mais informações e exemplos, consulte o artigo Lidar com dados.
Operador JOIN
O BigQuery suporta vários operadores JOIN
em cada cláusula FROM
.
As operações JOIN
subsequentes usam os resultados da operação JOIN
anterior como entrada JOIN
esquerda. Os campos de qualquer JOIN
input
anterior podem ser usados como chaves nas cláusulas ON
dos operadores JOIN
subsequentes.
Tipos de JOIN
O BigQuery suporta operações INNER
, [FULL|RIGHT|LEFT] OUTER
e CROSS JOIN
. Se não for especificado, o valor predefinido é INNER
.
As operações CROSS JOIN
não permitem cláusulas ON
. CROSS JOIN
pode devolver uma grande quantidade de dados e resultar numa consulta lenta e ineficiente ou numa consulta
que excede os recursos máximos permitidos por consulta. Essas consultas vão falhar com um erro. Sempre que possível, prefira consultas que não usem CROSS JOIN
. Por exemplo, CROSS JOIN
é frequentemente usado em locais onde as funções de janela seriam mais eficientes.
Modificador EACH
O modificador EACH
é uma sugestão que indica ao BigQuery para executar a função JOIN
usando várias partições. Isto é particularmente útil quando sabe que ambos os lados do
JOIN
são grandes. Não é possível usar o modificador EACH
em cláusulas CROSS JOIN
.
EACH
era incentivado em muitos casos, mas já não é assim. Sempre que possível, use JOIN
sem o modificador EACH
para um melhor desempenho.
Use JOIN EACH
quando a sua consulta falhar com uma mensagem de erro de recursos excedidos.
Semi-join e anti-join
Além de suportar JOIN
na cláusula FROM
, o BigQuery também
suporta dois tipos de junções na cláusula WHERE
: junção parcial e junção parcial anti. Uma junção parcial é especificada através da palavra-chave IN
com uma subconsulta; uma antijunção, através das palavras-chave NOT IN
.
Exemplos
A seguinte consulta usa uma junção parcial para encontrar n-gramas em que a primeira palavra no n-grama é também a segunda palavra noutro n-grama que tem "E" como a terceira palavra no n-grama.
#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;
A consulta seguinte usa uma junção parcial para devolver o número de mulheres com mais de 50 anos que deram à luz nos 10 estados com mais nascimentos.
#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 os números dos outros 40 estados, pode usar uma anti-junção. A consulta seguinte é
quase idêntica ao exemplo anterior, mas usa NOT IN
em vez de IN
para devolver o número de mulheres com mais de 50 anos que deram à luz nos 40 estados com o menor número de nascimentos.
#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:
- O BigQuery não suporta junções semijuntas ou antissemijuntas correlacionadas. A subconsulta não pode fazer referência a nenhum campo da consulta externa.
- A subconsulta usada numa junção semi ou antissemi tem de selecionar exatamente um campo.
-
Os tipos do campo selecionado e do campo usado na consulta externa na cláusula
WHERE
têm de corresponder exatamente. O BigQuery não faz nenhuma coerção de tipo para junções semi ou anti-semi.
Cláusula WHERE
A cláusula WHERE
, por vezes denominada predicado, filtra os registos produzidos pela cláusula
FROM
através de uma expressão booleana. É possível unir várias condições com cláusulas booleanas AND
e OR
, opcionalmente entre parênteses ( ) para as agrupar. Os campos apresentados numa cláusula WHERE
não têm de ser selecionados na cláusula SELECT
correspondente, e a expressão da cláusula WHERE
não pode fazer referência a expressões calculadas na cláusula SELECT
da consulta à qual a cláusula WHERE
pertence.
Nota: não é possível usar funções de agregação na cláusula WHERE
. Use uma cláusula
HAVING
e uma consulta externa se precisar de filtrar a saída de uma função de agregação.
Exemplo
O exemplo seguinte usa uma disjunção de expressões booleanas na cláusula WHERE
—as duas expressões unidas por um operador OR
. Um registo de entrada passa
pelo filtro WHERE
se qualquer uma das expressões devolver 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');
OMIT RECORD IF clause
A cláusula OMIT RECORD IF
é uma construção exclusiva do BigQuery. É particularmente útil para lidar com esquemas aninhados e repetidos. É semelhante a uma cláusula WHERE
, mas difere em dois aspetos importantes. Primeiro, usa uma condição de exclusão, o que significa que os registos são omitidos se a expressão devolver true
, mas mantidos se a expressão devolver false
ou null
. Em segundo lugar, a cláusula OMIT RECORD IF
pode (e normalmente usa) funções de agregação com âmbito na sua condição.
Além de filtrar registos completos, OMIT...IF
pode especificar um âmbito mais restrito
para filtrar apenas partes de um registo. Isto é feito usando o nome de um nó não folha no seu esquema, em vez de RECORD
na sua cláusula OMIT...IF
. Esta funcionalidade
é raramente usada pelos utilizadores do BigQuery. Pode encontrar mais documentação sobre este comportamento avançado
com hiperligação na documentação WITHIN
acima.
Se usar OMIT...IF
para excluir uma parte de um registo num campo repetido e a consulta também selecionar outros campos repetidos independentemente, o BigQuery omite uma parte dos outros registos repetidos na consulta. Se vir o erro
Cannot perform OMIT IF on repeated scope <scope> with independently repeating pass through field <field>,
recomendamos que mude para o GoogleSQL. Para informações sobre a migração de declarações OMIT...IF
para o GoogleSQL, consulte o artigo Migrar para o GoogleSQL.
Exemplo
Voltando ao exemplo usado para o modificador WITHIN
, pode usar OMIT RECORD IF
para fazer o mesmo que WITHIN
e HAVING
faziam nesse exemplo.
#legacySQL SELECT repository.url FROM [bigquery-public-data:samples.github_nested] OMIT RECORD IF COUNT(payload.pages.page_name) <= 80;
Cláusula GROUP BY
A cláusula GROUP BY
permite-lhe agrupar linhas que têm os mesmos valores para um determinado campo ou conjunto de campos, para que possa calcular agregações de campos relacionados. O agrupamento ocorre
após a filtragem realizada na cláusula WHERE
, mas antes de as expressões na cláusula
SELECT
serem calculadas. Não é possível usar os resultados da expressão como chaves de grupo na cláusula GROUP BY
.
Exemplo
Esta consulta encontra as dez primeiras palavras mais comuns no conjunto de dados de exemplo de trigramas.
Além de demonstrar a utilização da cláusula GROUP BY
, demonstra como os índices posicionais podem ser usados em vez dos nomes dos campos nas cláusulas GROUP BY
e ORDER BY
.
#legacySQL SELECT first, COUNT(ngram) FROM [bigquery-public-data:samples.trigrams] GROUP BY 1 ORDER BY 2 DESC LIMIT 10;
A agregação realizada com uma cláusula GROUP BY
é denominada agregação agrupada
. Ao contrário da agregação com âmbito, a agregação agrupada é comum na maioria dos sistemas de processamento de SQL.
O modificador EACH
O modificador EACH
é uma sugestão que indica ao BigQuery para executar a função GROUP BY
usando várias partições. Isto é particularmente útil quando sabe que o seu conjunto de dados contém um grande número de valores distintos para as chaves de grupo.
EACH
era incentivado em muitos casos, mas já não é assim.
A utilização de GROUP BY
sem o modificador EACH
oferece normalmente um melhor desempenho.
Use GROUP EACH BY
quando a sua consulta falhar com uma mensagem de erro de recursos excedidos.
A função ROLLUP
Quando a função ROLLUP
é usada, o BigQuery adiciona linhas adicionais ao resultado da consulta que
representam agregações agrupadas. Todos os campos indicados após ROLLUP
têm de estar
incluídos num único conjunto de parênteses. Nas linhas adicionadas devido à função ROLLUP
, NULL
indica as colunas para as quais a agregação é resumida.
Exemplo
Esta consulta gera contagens por ano de nascimentos masculinos e femininos a partir do conjunto de dados de natalidade de amostra.
#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;
Estes são os resultados da consulta. Repare que existem linhas em que uma ou ambas as chaves do grupo
são NULL
. Estas linhas são as linhas de agregação.
+------+---------+----------+ | 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 | +------+---------+----------+
Quando usar a função ROLLUP
, pode usar a função GROUPING
para distinguir entre linhas que foram adicionadas devido à função ROLLUP
e linhas que têm efetivamente um valor NULL
para a chave do grupo.
Exemplo
Esta consulta adiciona a função GROUPING
ao exemplo anterior para identificar melhor as linhas adicionadas devido à função 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;
Este é o resultado devolvido pela nova 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:
-
Os campos não agregados na cláusula
SELECT
têm de ser apresentados na 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. */
-
Não é possível usar expressões calculadas na cláusula
SELECT
na cláusulaGROUP BY
correspondente.#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. */ - O agrupamento por valores flutuantes e duplos não é suportado, porque a função de igualdade para esses tipos não está bem definida.
-
Uma vez que o sistema é interativo, as consultas que produzem um grande número de grupos podem falhar. A
utilização da
TOP
função em vez deGROUP BY
pode resolver alguns problemas de dimensionamento.
Cláusula HAVING
A cláusula HAVING
comporta-se exatamente como a cláusula WHERE
, exceto que é avaliada após a cláusula SELECT
, pelo que os resultados de todas as expressões calculadas são visíveis para a cláusula HAVING
. A cláusula HAVING só pode
referir-se às saídas da cláusula SELECT
correspondente.
Exemplo
Esta consulta calcula as palavras primeiras mais comuns no conjunto de dados de exemplo de n-gramas que contêm a letra a e ocorrem, no máximo, 10 000 vezes.
#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
A cláusula ORDER BY
ordena os resultados de uma consulta por ordem ascendente ou descendente
usando um ou mais campos principais. Para ordenar por vários campos ou alias, introduza-os como uma lista separada por vírgulas. Os resultados são ordenados pelos campos na ordem em que são apresentados.
Use DESC
(descendente) ou ASC
(ascendente) para especificar a direção da ordenação.
ASC
é a predefinição. Pode especificar uma direção de ordenação diferente para cada chave de ordenação.
A cláusula ORDER BY
é avaliada após a cláusula SELECT
para poder fazer referência ao resultado de qualquer expressão calculada na cláusula SELECT
. Se um campo receber um alias na cláusula SELECT
, o alias tem de ser usado na cláusula ORDER BY
.
Cláusula LIMIT
A cláusula LIMIT
limita o número de linhas no conjunto de resultados devolvido. Uma vez que as consultas do BigQuery
operam regularmente sobre um número muito elevado de linhas, LIMIT
é uma boa forma de
evitar consultas de longa duração processando apenas um subconjunto das linhas.
Notas:
-
A cláusula
LIMIT
para o processamento e devolve resultados quando cumpre os seus requisitos. Isto pode reduzir o tempo de processamento de algumas consultas, mas quando especifica funções agregadas, como COUNT ou cláusulasORDER BY
, o conjunto de resultados completo tem de ser processado antes de devolver os resultados. A cláusulaLIMIT
é a última a ser avaliada. -
Uma consulta com uma cláusula
LIMIT
pode continuar a ser não determinística se não existir um operador na consulta que garanta a ordenação do conjunto de resultados de saída. Isto acontece porque o BigQuery é executado com um grande número de trabalhadores paralelos. A ordem em que as tarefas paralelas são devolvidas não é garantida. -
A cláusula
LIMIT
não pode conter funções; só aceita uma constante numérica. -
Quando a cláusula
LIMIT
é usada, o total de bytes processados e os bytes faturados podem variar para a mesma consulta.
Gramática de consulta
As cláusulas individuais das declarações SELECT
do BigQuery são descritas detalhadamente
acima. Aqui, apresentamos a gramática completa das SELECT
declarações de forma compacta com links para as secções individuais.
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 }
Notação:
- Os parênteses retos "[ ]" indicam cláusulas opcionais.
- As chavetas "{ }" incluem um conjunto de opções.
- A barra vertical "|" indica um OU lógico.
- Uma vírgula ou uma palavra-chave seguida de reticências entre parênteses retos "[, ... ]" indica que o item anterior pode repetir-se numa lista com o separador especificado.
- Os parênteses "( )" indicam parênteses literais.
Funções e operadores suportados
A maioria das cláusulas de declaração SELECT
suporta funções. Os campos referenciados numa função não têm de ser apresentados numa cláusula SELECT
. Por conseguinte, a seguinte consulta é válida, mesmo que o campo clicks
não seja apresentado diretamente:
#legacySQL SELECT country, SUM(clicks) FROM table GROUP BY country;
Funções de agregação | |
---|---|
AVG() |
Devolve a média dos valores de um grupo de linhas… |
BIT_AND() |
Devolve o resultado de uma operação AND bit-a-bit ... |
BIT_OR() |
Devolve o resultado de uma operação OU bit a bit ... |
BIT_XOR() |
Devolve o resultado de uma operação XOU bit a bit ... |
CORR() |
Devolve o coeficiente de correlação de Pearson de um conjunto de pares de números. |
COUNT() |
Devolve o número total de valores ... |
COUNT([DISTINCT]) |
Devolve o número total de valores não NULL ... |
COVAR_POP() |
Calcula a covariância da população dos valores ... |
COVAR_SAMP() |
Calcula a covariância de amostra dos valores … |
EXACT_COUNT_DISTINCT() |
Devolve o número exato de valores distintos não NULL para o campo especificado. |
FIRST() |
Devolve o primeiro valor sequencial no âmbito da função. |
GROUP_CONCAT() |
Concatena várias strings numa única string… |
GROUP_CONCAT_UNQUOTED() |
Concatena várias strings numa única string … não adiciona aspas duplas … |
LAST() |
Devolve o último valor sequencial ... |
MAX() |
Devolve o valor máximo … |
MIN() |
Devolve o valor mínimo … |
NEST() |
Agrega todos os valores no âmbito de agregação atual num campo repetido. |
NTH() |
Devolve o enésimo valor sequencial ... |
QUANTILES() |
Calcula os valores mínimo, máximo e quantis aproximados… |
STDDEV() |
Devolve o desvio padrão ... |
STDDEV_POP() |
Calcula o desvio padrão da população ... |
STDDEV_SAMP() |
Calcula o desvio padrão amostral ... |
SUM() |
Devolve o total da soma dos valores ... |
TOP() ... COUNT(*) |
Devolve os registos superiores max_records por frequência. |
UNIQUE() |
Devolve o conjunto de valores únicos não NULL ... |
VARIANCE() |
Calcula a variância dos valores ... |
VAR_POP() |
Calcula a variância da população dos valores … |
VAR_SAMP() |
Calcula a variância de amostra dos valores ... |
Operadores aritméticos | |
---|---|
+ |
Adição |
- |
Subtração |
* |
Multiplicação |
/ |
Divisão |
% |
Módulo |
Funções bit a bit | |
---|---|
& |
AND bit a bit |
| |
OR bit-a-bit |
^ |
XOU bit a bit |
<< |
Deslocamento bit a bit para a esquerda |
>> |
Deslocamento bit a bit para a direita |
~ |
NOT bit a bit |
BIT_COUNT() |
Devolve o número de bits … |
Funções de transmissão | |
---|---|
BOOLEAN() |
Converter para booleano. |
BYTES() |
Converter para bytes. |
CAST(expr AS type) |
Converte expr numa variável do tipo type . |
FLOAT() |
Transmitir para o dobro. |
HEX_STRING() |
Converte para string hexadecimal. |
INTEGER() |
Converter em número inteiro. |
STRING() |
Converter para string. |
Funções de comparação | |
---|---|
expr1 = expr2 |
Devolve true se as expressões forem iguais. |
expr1 != expr2 expr1 <> expr2
|
Devolve true se as expressões não forem iguais. |
expr1 > expr2 |
Devolve true se expr1 for superior a expr2 . |
expr1 < expr2 |
Devolve true se expr1 for inferior a expr2 . |
expr1 >= expr2 |
Devolve true se expr1 for superior ou igual a expr2 . |
expr1 <= expr2 |
Devolve true se expr1 for inferior ou igual a expr2 . |
expr1 BETWEEN expr2 AND expr3 |
Devolve true se o valor de expr1
estiver entre expr2 e expr3 , inclusive. |
expr IS NULL |
Devolve true se expr for NULL. |
expr IN() |
Devolve true se expr corresponder a
expr1 , expr2 ou qualquer valor entre parênteses. |
COALESCE() |
Devolve o primeiro argumento que não seja NULL. |
GREATEST() |
Devolve o parâmetro numeric_expr mais elevado. |
IFNULL() |
Se o argumento não for nulo, devolve o argumento. |
IS_INF() |
Devolve true se for infinito positivo ou negativo. |
IS_NAN() |
Devolve true se o argumento for NaN . |
IS_EXPLICITLY_DEFINED() |
Descontinuado: em alternativa, use expr IS NOT NULL . |
LEAST() |
Devolve o parâmetro numeric_expr do argumento mais pequeno. |
NVL() |
Se expr não for nulo, devolve expr ; caso contrário, devolve null_default . |
Funções de data e hora | |
---|---|
CURRENT_DATE() |
Devolve a data atual no formato %Y-%m-%d . |
CURRENT_TIME() |
Devolve a hora atual do servidor no formato %H:%M:%S . |
CURRENT_TIMESTAMP() |
Devolve a hora atual do servidor no formato %Y-%m-%d %H:%M:%S . |
DATE() |
Devolve a data no formato %Y-%m-%d . |
DATE_ADD() |
Adiciona o intervalo especificado a um tipo de dados TIMESTAMP. |
DATEDIFF() |
Devolve o número de dias entre dois tipos de dados TIMESTAMP. |
DAY() |
Devolve o dia do mês como um número inteiro entre 1 e 31. |
DAYOFWEEK() |
Devolve o dia da semana como um número inteiro entre 1 (domingo) e 7 (sábado). |
DAYOFYEAR() |
Devolve o dia do ano como um número inteiro entre 1 e 366. |
FORMAT_UTC_USEC() |
Devolve uma indicação de tempo UNIX no formato YYYY-MM-DD HH:MM:SS.uuuuuu . |
HOUR() |
Devolve a hora de uma TIMESTAMP como um número inteiro entre 0 e 23. |
MINUTE() |
Devolve os minutos de uma DATA/HORA como um número inteiro entre 0 e 59. |
MONTH() |
Devolve o mês de uma TIMESTAMP como um número inteiro entre 1 e 12. |
MSEC_TO_TIMESTAMP() |
Converte uma indicação de tempo UNIX em milissegundos num formato de data/hora. |
NOW() |
Devolve a indicação de tempo UNIX atual em microssegundos. |
PARSE_UTC_USEC() |
Converte uma string de data numa indicação de tempo UNIX em microssegundos. |
QUARTER() |
Devolve o trimestre do ano de uma TIMESTAMP como um número inteiro entre 1 e 4. |
SEC_TO_TIMESTAMP() |
Converte uma indicação de tempo UNIX em segundos numa indicação de tempo. |
SECOND() |
Devolve os segundos de uma TIMESTAMP como um número inteiro entre 0 e 59. |
STRFTIME_UTC_USEC() |
Devolve uma string de data no formato date_format_str. |
TIME() |
Devolve uma DATA/HORA no formato %H:%M:%S . |
TIMESTAMP() |
Converta uma string de data num TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
Converte uma TIMESTAMP numa indicação de tempo UNIX em milissegundos. |
TIMESTAMP_TO_SEC() |
Converte uma data/hora num formato de data/hora Unix em segundos. |
TIMESTAMP_TO_USEC() |
Converte uma TIMESTAMP numa indicação de tempo UNIX em microssegundos. |
USEC_TO_TIMESTAMP() |
Converte uma indicação de tempo UNIX em microssegundos num formato de data/hora. |
UTC_USEC_TO_DAY() |
Desloca uma indicação de tempo UNIX em microssegundos para o início do dia em que ocorre. |
UTC_USEC_TO_HOUR() |
Desloca uma indicação de tempo UNIX em microssegundos para o início da hora em que ocorre. |
UTC_USEC_TO_MONTH() |
Desloca uma indicação de tempo UNIX em microssegundos para o início do mês em que ocorre. |
UTC_USEC_TO_WEEK() |
Devolve uma indicação de tempo UNIX em microssegundos que representa um dia da semana. |
UTC_USEC_TO_YEAR() |
Devolve uma indicação de tempo UNIX em microssegundos que representa o ano. |
WEEK() |
Devolve a semana de uma TIMESTAMP como um número inteiro entre 1 e 53. |
YEAR() |
Devolve o ano de uma data/hora. |
Funções de IP | |
---|---|
FORMAT_IP() |
Converte os 32 bits menos significativos de integer_value numa string de endereço IPv4 legível. |
PARSE_IP() |
Converte uma string que representa um endereço IPv4 num valor inteiro sem sinal. |
FORMAT_PACKED_IP() |
Devolve um endereço IP legível no formato
10.1.5.23 ou 2620:0:1009:1:216:36ff:feef:3f . |
PARSE_PACKED_IP() |
Devolve um endereço IP em BYTES. |
Funções JSON | |
---|---|
JSON_EXTRACT() |
Seleciona um valor de acordo com a expressão JSONPath e devolve uma string JSON. |
JSON_EXTRACT_SCALAR() |
Seleciona um valor de acordo com a expressão JSONPath e devolve um escalar JSON. |
Operadores lógicos | |
---|---|
expr AND expr |
Devolve true se ambas as expressões forem verdadeiras. |
expr OR expr |
Devolve true se uma ou ambas as expressões forem verdadeiras. |
NOT expr |
Devolve true se a expressão for falsa. |
Funções matemáticas | |
---|---|
ABS() |
Devolve o valor absoluto do argumento. |
ACOS() |
Devolve o arco cosseno do argumento. |
ACOSH() |
Devolve o arco cosseno hiperbólico do argumento. |
ASIN() |
Devolve o arco seno do argumento. |
ASINH() |
Devolve o arco seno hiperbólico do argumento. |
ATAN() |
Devolve a arcotangente do argumento. |
ATANH() |
Devolve a tangente hiperbólica inversa do argumento. |
ATAN2() |
Devolve a arcotangente dos dois argumentos. |
CEIL() |
Arredonda o argumento para o número inteiro mais próximo e devolve o valor arredondado. |
COS() |
Devolve o cosseno do argumento. |
COSH() |
Devolve o cosseno hiperbólico do argumento. |
DEGREES() |
Converte de radianos para graus. |
EXP() |
Devolve e elevado à potência do argumento. |
FLOOR() |
Arredonda o argumento para baixo, para o número inteiro mais próximo. |
LN() LOG()
|
Devolve o logaritmo natural do argumento. |
LOG2() |
Devolve o logaritmo de base 2 do argumento. |
LOG10() |
Devolve o logaritmo de base 10 do argumento. |
PI() |
Devolve a constante π. |
POW() |
Devolve o primeiro argumento elevado à potência do segundo argumento. |
RADIANS() |
Converte de graus para radianos. |
RAND() |
Devolve um valor de ponto flutuante aleatório no intervalo 0,0 <= valor < 1,0. |
ROUND() |
Arredonda o argumento para cima ou para baixo para o número inteiro mais próximo. |
SIN() |
Devolve o seno do argumento. |
SINH() |
Devolve o seno hiperbólico do argumento. |
SQRT() |
Devolve a raiz quadrada da expressão. |
TAN() |
Devolve a tangente do argumento. |
TANH() |
Devolve a tangente hiperbólica do argumento. |
Funções de expressões regulares | |
---|---|
REGEXP_MATCH() |
Devolve true se o argumento corresponder à expressão regular. |
REGEXP_EXTRACT() |
Devolve a parte do argumento que corresponde ao grupo de captura na expressão regular. |
REGEXP_REPLACE() |
Substitui uma substring que corresponde a uma expressão regular. |
Funções de string | |
---|---|
CONCAT() |
Devolve a concatenação de duas ou mais strings ou NULL se algum dos valores for NULL. |
expr CONTAINS 'str' |
Devolve true se expr contiver o argumento de string especificado. |
INSTR() |
Devolve o índice baseado em um da primeira ocorrência de uma string. |
LEFT() |
Devolve os carateres mais à esquerda de uma string. |
LENGTH() |
Devolve o comprimento da string. |
LOWER() |
Devolve a string original com todos os carateres em minúsculas. |
LPAD() |
Insere carateres à esquerda de uma string. |
LTRIM() |
Remove carateres do lado esquerdo de uma string. |
REPLACE() |
Substitui todas as ocorrências de uma subcadeia de carateres. |
RIGHT() |
Devolve os carateres mais à direita de uma string. |
RPAD() |
Insere carateres no lado direito de uma string. |
RTRIM() |
Remove carateres finais do lado direito de uma string. |
SPLIT() |
Divide uma string em substrings repetidas. |
SUBSTR() |
Devolve uma substring … |
UPPER() |
Devolve a string original com todos os carateres em maiúsculas. |
Funções de carateres universais de tabelas | |
---|---|
TABLE_DATE_RANGE() |
Consultar várias tabelas diárias que abrangem um intervalo de datas. |
TABLE_DATE_RANGE_STRICT() |
Consultas a várias tabelas diárias que abrangem um intervalo de datas, sem datas em falta. |
TABLE_QUERY() |
Consulta tabelas cujos nomes correspondem a um predicado especificado. |
Funções de URL | |
---|---|
HOST() |
Dado um URL, devolve o nome do anfitrião como uma string. |
DOMAIN() |
Dado um URL, devolve o domínio como uma string. |
TLD() |
Dado um URL, devolve o domínio de nível superior mais qualquer domínio de país no URL. |
Funções de janela | |
---|---|
AVG() COUNT(*) COUNT([DISTINCT]) MAX() MIN() STDDEV() SUM() |
A mesma operação que as funções de agregação correspondentes, mas são calculadas num período definido pela cláusula OVER. |
CUME_DIST() |
Devolve um valor duplo que indica a distribuição cumulativa de um valor num grupo de valores… |
DENSE_RANK() |
Devolve a classificação inteira de um valor num grupo de valores. |
FIRST_VALUE() |
Devolve o primeiro valor do campo especificado na janela. |
LAG() |
Permite-lhe ler dados de uma linha anterior numa janela. |
LAST_VALUE() |
Devolve o último valor do campo especificado na janela. |
LEAD() |
Permite-lhe ler dados de uma linha seguinte numa janela. |
NTH_VALUE() |
Devolve o valor de <expr> na posição
<n> da moldura da janela ...
|
NTILE() |
Divide a janela no número especificado de grupos. |
PERCENT_RANK() |
Devolve a classificação da linha atual, relativamente às outras linhas na partição. |
PERCENTILE_CONT() |
Devolve um valor interpolado que seria mapeado para o argumento de percentil relativamente à janela ... |
PERCENTILE_DISC() |
Devolve o valor mais próximo da percentagem do argumento na janela. |
RANK() |
Devolve a classificação inteira de um valor num grupo de valores. |
RATIO_TO_REPORT() |
Devolve a proporção de cada valor em relação à soma dos valores. |
ROW_NUMBER() |
Devolve o número da linha atual do resultado da consulta na janela. |
Outras funções | |
---|---|
CASE WHEN ... THEN |
Use CASE para escolher entre duas ou mais expressões alternativas na sua consulta. |
CURRENT_USER() |
Devolve o endereço de email do utilizador que está a executar a consulta. |
EVERY() |
Devolve verdadeiro se o argumento for verdadeiro para todas as respetivas entradas. |
FROM_BASE64() |
Converte a string de entrada codificada em base64 no formato BYTES. |
HASH() |
Calcula e devolve um valor de hash com sinal de 64 bits… |
FARM_FINGERPRINT() |
Calcula e devolve um valor de impressão digital com sinal de 64 bits ... |
IF() |
Se o primeiro argumento for verdadeiro, devolve o segundo argumento; caso contrário, devolve o terceiro argumento. |
POSITION() |
Devolve a posição sequencial baseada em 1 do argumento. |
SHA1() |
Devolve um hash SHA1 no formato BYTES. |
SOME() |
Devolve verdadeiro se o argumento for verdadeiro para, pelo menos, uma das respetivas entradas. |
TO_BASE64() |
Converte o argumento BYTES numa string codificada em base-64. |
Funções de agregação
As funções de agregação devolvem valores que representam resumos de conjuntos de dados maiores, o que torna estas funções particularmente úteis para analisar registos. Uma função de agregação opera contra uma coleção de valores e devolve um único valor por tabela, grupo ou âmbito:
- Agregação de tabelas
Usa uma função de agregação para resumir todas as linhas elegíveis na tabela. Por exemplo:
SELECT COUNT(f1) FROM ds.Table;
- Agregação de grupos
Usa uma função de agregação e uma cláusula
GROUP BY
que especifica um campo não agregado para resumir as linhas por grupo. Por exemplo:SELECT COUNT(f1) FROM ds.Table GROUP BY b1;
A função TOP representa um caso especializado de agregação de grupos.
- Agregação com âmbito
Esta funcionalidade aplica-se apenas a tabelas que tenham campos aninhados.
Usa uma função de agregação e a palavra-chaveWITHIN
para agregar valores repetidos num âmbito definido. Por exemplo:SELECT COUNT(m1.f2) WITHIN RECORD FROM Table;
O âmbito pode ser
RECORD
, que corresponde a toda a linha, ou um nó (campo repetido numa linha). As funções de agregação operam sobre os valores no âmbito e devolvem resultados agregados para cada registo ou nó.
Pode aplicar uma restrição a uma função de agregação através de uma das seguintes opções:
-
Um alias numa consulta subselect. A restrição é especificada na cláusula
WHERE
exterior.#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
-
Um alias numa 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;
Também pode referir-se a um alias nas cláusulas GROUP BY
ou ORDER BY
.
Sintaxe
Funções de agregação | |
---|---|
AVG() |
Devolve a média dos valores de um grupo de linhas… |
BIT_AND() |
Devolve o resultado de uma operação AND bit-a-bit ... |
BIT_OR() |
Devolve o resultado de uma operação OU bit a bit ... |
BIT_XOR() |
Devolve o resultado de uma operação XOU bit a bit ... |
CORR() |
Devolve o coeficiente de correlação de Pearson de um conjunto de pares de números. |
COUNT() |
Devolve o número total de valores ... |
COUNT([DISTINCT]) |
Devolve o número total de valores não NULL ... |
COVAR_POP() |
Calcula a covariância da população dos valores ... |
COVAR_SAMP() |
Calcula a covariância de amostra dos valores … |
EXACT_COUNT_DISTINCT() |
Devolve o número exato de valores distintos não NULL para o campo especificado. |
FIRST() |
Devolve o primeiro valor sequencial no âmbito da função. |
GROUP_CONCAT() |
Concatena várias strings numa única string… |
GROUP_CONCAT_UNQUOTED() |
Concatena várias strings numa única string … não adiciona aspas duplas … |
LAST() |
Devolve o último valor sequencial ... |
MAX() |
Devolve o valor máximo … |
MIN() |
Devolve o valor mínimo … |
NEST() |
Agrega todos os valores no âmbito de agregação atual num campo repetido. |
NTH() |
Devolve o enésimo valor sequencial ... |
QUANTILES() |
Calcula os valores mínimo, máximo e quantis aproximados… |
STDDEV() |
Devolve o desvio padrão ... |
STDDEV_POP() |
Calcula o desvio padrão da população ... |
STDDEV_SAMP() |
Calcula o desvio padrão amostral ... |
SUM() |
Devolve o total da soma dos valores ... |
TOP() ... COUNT(*) |
Devolve os registos superiores max_records por frequência. |
UNIQUE() |
Devolve o conjunto de valores únicos não NULL ... |
VARIANCE() |
Calcula a variância dos valores ... |
VAR_POP() |
Calcula a variância da população dos valores … |
VAR_SAMP() |
Calcula a variância de amostra dos valores ... |
AVG(numeric_expr)
- Devolve a média dos valores de um grupo de linhas calculada por
numeric_expr
. As linhas com um valor NULL não são incluídas no cálculo. BIT_AND(numeric_expr)
- Devolve o resultado de uma operação
AND
bit a bit entre cada instância denumeric_expr
em todas as linhas. Os valoresNULL
são ignorados. Esta função devolveNULL
se todas as instâncias denumeric_expr
forem avaliadas comoNULL
. BIT_OR(numeric_expr)
- Devolve o resultado de uma operação
OR
bit a bit entre cada instância denumeric_expr
em todas as linhas. Os valoresNULL
são ignorados. Esta função devolveNULL
se todas as instâncias denumeric_expr
forem avaliadas comoNULL
. BIT_XOR(numeric_expr)
- Devolve o resultado de uma operação
XOR
bit a bit entre cada instância denumeric_expr
em todas as linhas. Os valoresNULL
são ignorados. Esta função devolveNULL
se todas as instâncias denumeric_expr
forem avaliadas comoNULL
. CORR(numeric_expr, numeric_expr)
- Devolve o coeficiente de correlação de Pearson de um conjunto de pares de números.
COUNT(*)
- Devolve o número total de valores (NULL e não NULL) no âmbito da função. A menos que esteja a usar
COUNT(*)
com a funçãoTOP
, é melhor especificar explicitamente o campo a contabilizar. COUNT([DISTINCT] field [, n])
- Devolve o número total de valores não NULL no âmbito da função.
Se usar a palavra-chave
DISTINCT
, a função devolve o número de valores distintos para o campo especificado. Tenha em atenção que o valor devolvido paraDISTINCT
é uma aproximação estatística e não é garantido que seja exato.Use
EXACT_COUNT_DISTINCT()
para uma resposta exata.Se precisar de uma maior precisão do
, pode especificar um segundo parâmetro,COUNT(DISTINCT)
n
, que indica o limite abaixo do qual os resultados exatos são garantidos. Por predefinição,n
é 1000, mas se indicar um valor den
superior, recebe resultados exatos paraCOUNT(DISTINCT)
até esse valor den
. No entanto, atribuir valores maiores an
reduz a escalabilidade deste operador e pode aumentar substancialmente o tempo de execução da consulta ou fazer com que a consulta falhe.Para calcular o número exato de valores distintos, use EXACT_COUNT_DISTINCT. Em alternativa, para uma abordagem mais escalável, considere usar
GROUP EACH BY
nos campos relevantes e, em seguida, aplicarCOUNT(*)
. A abordagemGROUP EACH BY
é mais escalável, mas pode incorrer numa ligeira penalização do desempenho inicial. COVAR_POP(numeric_expr1, numeric_expr2)
- Calcula a covariância da população dos valores calculados por
numeric_expr1
enumeric_expr2
. COVAR_SAMP(numeric_expr1, numeric_expr2)
- Calcula a covariância da amostra dos valores calculados por
numeric_expr1
enumeric_expr2
. EXACT_COUNT_DISTINCT(field)
- Devolve o número exato de valores distintos e não NULL para o campo especificado. Para uma melhor escalabilidade e desempenho, use COUNT(DISTINCT field).
FIRST(expr)
- Devolve o primeiro valor sequencial no âmbito da função.
GROUP_CONCAT('str' [, separator])
-
Concatena várias strings numa única string, em que cada valor é separado pelo parâmetro
separator
opcional. Seseparator
for omitido, o BigQuery devolve uma string separada por vírgulas.Se uma string nos dados de origem contiver um caráter de aspas duplas, a função
GROUP_CONCAT
devolve a string com aspas duplas adicionadas. Por exemplo, a stringa"b
seria devolvida como"a""b"
. UseGROUP_CONCAT_UNQUOTED
se preferir que estas strings não sejam devolvidas com as aspas duplas adicionadas.Exemplo:
#legacySQL SELECT GROUP_CONCAT(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
GROUP_CONCAT_UNQUOTED('str' [, separator])
-
Concatena várias strings numa única string, em que cada valor é separado pelo parâmetro
separator
opcional. Seseparator
for omitido, o BigQuery devolve uma string separada por vírgulas.Ao contrário de
GROUP_CONCAT
, esta função não adiciona aspas duplas aos valores devolvidos que incluem um caráter de aspas duplas. Por exemplo, a stringa"b
seria devolvida comoa"b
.Exemplo:
#legacySQL SELECT GROUP_CONCAT_UNQUOTED(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
LAST(field)
- Devolve o último valor sequencial no âmbito da função.
MAX(field)
- Devolve o valor máximo no âmbito da função.
MIN(field)
- Devolve o valor mínimo no âmbito da função.
NEST(expr)
-
Agrega todos os valores no âmbito de agregação atual num campo repetido. Por exemplo, a consulta
"SELECT x, NEST(y) FROM ... GROUP BY x"
devolve um registo de saída para cada valorx
distinto e contém um campo repetido para todos os valoresy
sincronizados comx
na entrada da consulta. A funçãoNEST
requer uma cláusulaGROUP BY
.O BigQuery reduz automaticamente os resultados da consulta. Por isso, se usar a função
NEST
na consulta de nível superior, os resultados não vão conter campos repetidos. Use a funçãoNEST
quando usar uma subseleção que produza resultados intermédios para utilização imediata pela mesma consulta. NTH(n, field)
- Devolve o
n
º valor sequencial no âmbito da função, em quen
é uma constante. A funçãoNTH
começa a contar a partir de 1, pelo que não existe um termo zero. Se o âmbito da função tiver menos den
valores, a função devolveNULL
. QUANTILES(expr[, buckets])
-
Calcula os valores mínimos, máximos e quantis aproximados para a expressão de entrada. Os valores de entrada
NULL
são ignorados. Uma entrada vazia ou exclusivamenteNULL
resulta numa saídaNULL
. O número de quantis calculados é controlado com o parâmetrobuckets
opcional, que inclui o mínimo e o máximo na contagem. Para calcular os N-tiles aproximados, use N+1buckets
. O valor predefinido debuckets
é 100. (Nota: o valor predefinido de 100 não estima percentis. Para estimar percentis, use, no mínimo, 101buckets
.) Se especificado explicitamente,buckets
tem de ser, pelo menos, 2.O erro fracionário por quantil é épsilon = 1 /
buckets
, o que significa que o erro diminui à medida que o número de contentores aumenta. Por exemplo: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.
A função
NTH
pode ser usada para escolher um quantil específico, mas lembre-se de queNTH
tem base 1 e queQUANTILES
devolve o mínimo (o "0.º" quantil) na primeira posição e o máximo (o "100.º" percentil ou o "N.º" N-til) na última posição. Por exemplo,NTH(11, QUANTILES(expr, 21))
estima a mediana deexpr
, enquantoNTH(20, QUANTILES(expr, 21))
estima o 19.º vigintile (percentil 95) deexpr
. Ambas as estimativas têm uma margem de erro de 5%.Para melhorar a precisão, use mais intervalos. Por exemplo, para reduzir a margem de erro dos cálculos anteriores de 5% para 0,1%, use 1001 contentores em vez de 21 e ajuste o argumento à função
NTH
em conformidade. Para calcular a mediana com um erro de 0,1%, useNTH(501, QUANTILES(expr, 1001))
; para o 95.º percentil com um erro de 0,1%, useNTH(951, QUANTILES(expr, 1001))
. STDDEV(numeric_expr)
- Devolve o desvio padrão dos valores calculados por
numeric_expr
. As linhas com um valor NULL não são incluídas no cálculo. A funçãoSTDDEV
é um alias deSTDDEV_SAMP
. STDDEV_POP(numeric_expr)
- Calcula o desvio padrão da população do valor calculado por
numeric_expr
. UseSTDDEV_POP()
para calcular o desvio padrão de um conjunto de dados que abrange toda a população de interesse. Se o seu conjunto de dados incluir apenas uma amostra representativa da população, useSTDDEV_SAMP()
em alternativa. Para mais informações sobre o desvio padrão da população em comparação com o desvio padrão da amostra, consulte o artigo Desvio padrão na Wikipédia. STDDEV_SAMP(numeric_expr)
- Calcula o desvio padrão da amostra do valor calculado por
numeric_expr
. UseSTDDEV_SAMP()
para calcular o desvio padrão de uma população inteira com base numa amostra representativa da população. Se o seu conjunto de dados abranger toda a população, useSTDDEV_POP()
em alternativa. Para mais informações sobre o desvio padrão da população em comparação com o desvio padrão da amostra, consulte o artigo Desvio padrão na Wikipédia. SUM(field)
- Devolve o total da soma dos valores no âmbito da função. Apenas para utilização com tipos de dados numéricos.
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
- Devolve os max_records principais registos por frequência. Consulte a descrição da TOP abaixo para ver detalhes.
UNIQUE(expr)
- Devolve o conjunto de valores exclusivos e não NULL no âmbito da função numa ordem indefinida. Semelhante a uma cláusula
GROUP BY
grande sem a palavra-chaveEACH
, a consulta falha com um erro "Resources Exceeded" se existirem demasiados valores distintos. No entanto, ao contrário deGROUP BY
, a funçãoUNIQUE
pode ser aplicada com agregação no âmbito, o que permite uma operação eficiente em campos aninhados com um número limitado de valores. VARIANCE(numeric_expr)
- Calcula a variância dos valores calculados por
numeric_expr
. As linhas com um valor NULL não são incluídas no cálculo. A funçãoVARIANCE
é um alias deVAR_SAMP
. VAR_POP(numeric_expr)
- Calcula a variância da população dos valores calculados por
numeric_expr
. Para mais informações sobre o desvio padrão da população em comparação com o desvio padrão da amostra, consulte o artigo Desvio padrão na Wikipédia. VAR_SAMP(numeric_expr)
- Calcula a variância da amostra dos valores calculados por
numeric_expr
. Para mais informações sobre o desvio padrão da população em comparação com o desvio padrão da amostra, consulte o artigo Desvio padrão na Wikipédia.
Função TOP()
TOP é uma função que é uma alternativa à cláusula GROUP BY. É usado como sintaxe simplificada para GROUP BY ... ORDER BY ... LIMIT ...
. Geralmente, a função TOP tem um desempenho mais rápido do que a consulta ... GROUP BY ... ORDER BY ... LIMIT ...
completa, mas pode devolver apenas resultados aproximados. Segue-se a sintaxe da função TOP:
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
Quando usar TOP numa cláusula SELECT
, tem de incluir COUNT(*)
como um dos campos.
Uma consulta que usa a função TOP() só pode devolver dois campos: o campo TOP e o valor COUNT(*).
field|alias
- O campo ou o alias a devolver.
max_values
- [Opcional] O número máximo de resultados a devolver. A predefinição é 20.
multiplier
- Um número inteiro positivo que aumenta os valores devolvidos por
COUNT(*)
pelo múltiplo especificado.
Exemplos de TOP()
-
Exemplos de consultas básicas que usam
TOP()
As seguintes consultas usam
TOP()
para devolver 10 linhas.Exemplo 1:
#legacySQL SELECT TOP(word, 10) as word, COUNT(*) as cnt FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th";
Exemplo 2:
#legacySQL SELECT word, left(word, 3) FROM (SELECT TOP(word, 10) AS word, COUNT(*) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th");
-
Compare
TOP()
comGROUP BY...ORDER BY...LIMIT
A consulta devolve, por ordem, as 10 palavras mais usadas que contêm "th" e o número de documentos em que as palavras foram usadas. A consulta
TOP
é executada muito mais rapidamente:Exemplo sem
TOP()
:#legacySQL SELECT word, COUNT(*) AS cnt FROM ds.Table WHERE word CONTAINS 'th' GROUP BY word ORDER BY cnt DESC LIMIT 10;
Exemplo com
TOP()
:#legacySQL SELECT TOP(word, 10), COUNT(*) FROM ds.Table WHERE word contains 'th';
-
Usar o parâmetro
multiplier
.As consultas seguintes mostram como o parâmetro
multiplier
afeta o resultado da consulta. A primeira consulta devolve o número de nascimentos por mês no Wyoming. A segunda consulta usa o parâmetromultiplier
para multiplicar os valores decnt
por 100.Exemplo sem o parâmetro
multiplier
:#legacySQL SELECT TOP(month,3) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
Devoluções:
+-------+-------+ | month | cnt | +-------+-------+ | 7 | 19594 | | 5 | 19038 | | 8 | 19030 | +-------+-------+
Exemplo com o parâmetro
multiplier
:#legacySQL SELECT TOP(month,3,100) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
Devoluções:
+-------+---------+ | month | cnt | +-------+---------+ | 7 | 1959400 | | 5 | 1903800 | | 8 | 1903000 | +-------+---------+
Nota: tem de incluir COUNT(*)
na cláusula SELECT
para usar TOP
.
Exemplos avançados
-
Média e desvio padrão agrupados por condição
A seguinte consulta devolve a média e o desvio padrão dos pesos à nascença no Ohio em 2003, agrupados por mães que fumam e não fumam.
Exemplo:
#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;
-
Filtre os resultados da consulta através de um valor agregado
Para filtrar os resultados da consulta através de um valor agregado (por exemplo, filtrar pelo valor de um
SUM
), use a funçãoHAVING
.HAVING
compara um valor com um resultado determinado por uma função de agregação, ao contrário deWHERE
, que opera em cada linha antes da agregação.Exemplo:
#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
Devoluções:
+-------+--------+---------+ | 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
Os operadores aritméticos usam argumentos numéricos e devolvem um resultado numérico. Cada argumento pode ser um literal numérico ou um valor numérico devolvido por uma consulta. Se a operação aritmética for avaliada como um resultado indefinido, a operação devolve NULL
.
Sintaxe
Operador | Descrição | Exemplo |
---|---|---|
+ | Adição |
Devoluções: 10 |
- | Subtração |
Devoluções: 1 |
* | Multiplicação |
Devoluções: 24 |
/ | Divisão |
Devoluções: 1,5 |
% | Módulo |
Devoluções: 2 |
Funções bit a bit
As funções bit-a-bit operam ao nível de bits individuais e requerem argumentos numéricos. Para mais informações sobre as funções bit a bit, consulte o artigo Operação bit a bit.
Três funções bit a bit adicionais, BIT_AND
, BIT_OR
e BIT_XOR
, estão documentadas nas funções de agregação.
Sintaxe
Operador | Descrição | Exemplo |
---|---|---|
& | AND bit a bit |
Devoluções: 0 |
| | OR bit-a-bit |
Devoluções: 28 |
^ | XOU bit a bit |
Devoluções: 1 |
<< | Deslocamento bit a bit para a esquerda |
Devoluções: 16 |
>> | Deslocamento bit a bit para a direita |
Devoluções: 2 |
~ | NOT bit a bit |
Devoluções: -3 |
BIT_COUNT(<numeric_expr>) |
Devolve o número de bits definidos em |
Devoluções: 4 |
Funções de transmissão
As funções de conversão alteram o tipo de dados de uma expressão numérica. As funções de conversão são particularmente úteis para garantir que os argumentos numa função de comparação têm o mesmo tipo de dados.
Sintaxe
Funções de transmissão | |
---|---|
BOOLEAN() |
Converter para booleano. |
BYTES() |
Converter para bytes. |
CAST(expr AS type) |
Converte expr numa variável do tipo type . |
FLOAT() |
Transmitir para o dobro. |
HEX_STRING() |
Converte para string hexadecimal. |
INTEGER() |
Converter em número inteiro. |
STRING() |
Converter para string. |
BOOLEAN(<numeric_expr>)
-
- Devolve
true
se<numeric_expr>
não for 0 nem NULL. - Devolve
false
se<numeric_expr>
for 0. - Devolve
NULL
se<numeric_expr>
for NULL.
- Devolve
BYTES(string_expr)
- Devolve
string_expr
como um valor do tipobytes
. CAST(expr AS type)
- Converte
expr
numa variável do tipotype
. FLOAT(expr)
-
Devolve
expr
como um número de vírgula flutuante de precisão dupla. Oexpr
pode ser uma string como'45.78'
, mas a função devolveNULL
para valores não numéricos. HEX_STRING(numeric_expr)
- Devolve
numeric_expr
como uma string hexadecimal. INTEGER(expr)
-
Converte
expr
num número inteiro de 64 bits.- Devolve NULL se
expr
for uma string que não corresponda a um valor inteiro. - Devolve o número de microssegundos desde a época Unix se
expr
for uma data/hora.
- Devolve NULL se
STRING(numeric_expr)
- devolve
numeric_expr
como uma string.
Funções de comparação
As funções de comparação devolvem true
ou false
, com base nos seguintes tipos de comparações:
- Uma comparação de duas expressões.
- Uma comparação de uma expressão ou um conjunto de expressões com um critério específico, como estar numa lista especificada, ser NULL ou ser um valor opcional não predefinido.
Algumas das funções indicadas abaixo devolvem valores diferentes de true
ou false
, mas os valores que devolvem baseiam-se em operações de comparação.
Pode usar expressões numéricas ou de string como argumentos para funções de comparação. (As constantes de string têm de estar entre aspas simples ou duplas.) As expressões podem ser literais ou valores obtidos por uma consulta. As funções de comparação são usadas com mais frequência como condições de filtragem em cláusulas WHERE
, mas podem ser usadas noutras cláusulas.
Sintaxe
Funções de comparação | |
---|---|
expr1 = expr2 |
Devolve true se as expressões forem iguais. |
expr1 != expr2 expr1 <> expr2
|
Devolve true se as expressões não forem iguais. |
expr1 > expr2 |
Devolve true se expr1 for superior a expr2 . |
expr1 < expr2 |
Devolve true se expr1 for inferior a expr2 . |
expr1 >= expr2 |
Devolve true se expr1 for superior ou igual a expr2 . |
expr1 <= expr2 |
Devolve true se expr1 for inferior ou igual a expr2 . |
expr1 BETWEEN expr2 AND expr3 |
Devolve true se o valor de expr1
estiver entre expr2 e expr3 , inclusive. |
expr IS NULL |
Devolve true se expr for NULL. |
expr IN() |
Devolve true se expr corresponder a
expr1 , expr2 ou qualquer valor entre parênteses. |
COALESCE() |
Devolve o primeiro argumento que não seja NULL. |
GREATEST() |
Devolve o parâmetro numeric_expr mais elevado. |
IFNULL() |
Se o argumento não for nulo, devolve o argumento. |
IS_INF() |
Devolve true se for infinito positivo ou negativo. |
IS_NAN() |
Devolve true se o argumento for NaN . |
IS_EXPLICITLY_DEFINED() |
Descontinuado: em alternativa, use expr IS NOT NULL . |
LEAST() |
Devolve o parâmetro numeric_expr do argumento mais pequeno. |
NVL() |
Se expr não for nulo, devolve expr ; caso contrário, devolve null_default . |
expr1 = expr2
- Devolve
true
se as expressões forem iguais. expr1 != expr2
expr1 <> expr2
- Devolve
true
se as expressões não forem iguais. expr1 > expr2
- Devolve
true
seexpr1
for superior aexpr2
. expr1 < expr2
- Devolve
true
seexpr1
for inferior aexpr2
. expr1 >= expr2
- devolve
true
seexpr1
for superior ou igual aexpr2
. expr1 <= expr2
- devolve
true
seexpr1
for inferior ou igual aexpr2
. expr1 BETWEEN expr2 AND expr3
-
Devolve
true
se o valor deexpr1
for superior ou igual aexpr2
e inferior ou igual aexpr3
. expr IS NULL
- Devolve
true
seexpr
for NULL. expr IN(expr1, expr2, ...)
- Devolve
true
seexpr
corresponder aexpr1
,expr2
ou qualquer valor entre parênteses. A palavra-chaveIN
é uma abreviatura eficiente de(expr = expr1 || expr = expr2 || ...)
. As expressões usadas com a palavra-chaveIN
têm de ser constantes e têm de corresponder ao tipo de dados deexpr
. A cláusulaIN
também pode ser usada para criar junções parciais e junções anti. Para mais informações, consulte os artigos Semi-join e Anti-join. COALESCE(<expr1>, <expr2>, ...)
- Devolve o primeiro argumento que não é NULL.
GREATEST(numeric_expr1, numeric_expr2, ...)
-
Devolve o parâmetro
numeric_expr
mais elevado. Todos os parâmetros têm de ser numéricos e do mesmo tipo. Se algum parâmetro forNULL
, esta função devolveNULL
.Para ignorar valores
NULL
, use a funçãoIFNULL
para alterar os valoresNULL
para um valor que não afete a comparação. No exemplo de código seguinte, a funçãoIFNULL
é usada para alterar os valoresNULL
para-1
, o que não afeta a comparação entre números positivos.SELECT GREATEST(IFNULL(a,-1), IFNULL(b,-1)) FROM (SELECT 1 as a, NULL as b);
IFNULL(expr, null_default)
- Se
expr
não for nulo, devolveexpr
. Caso contrário, devolvenull_default
. IS_INF(numeric_expr)
- Devolve
true
senumeric_expr
for infinito positivo ou negativo. IS_NAN(numeric_expr)
- Devolve
true
senumeric_expr
for o valor numérico especialNaN
. IS_EXPLICITLY_DEFINED(expr)
-
Esta função foi descontinuada. Em alternativa, use
expr IS NOT NULL
. LEAST(numeric_expr1, numeric_expr2, ...)
-
Devolve o parâmetro
numeric_expr
mais pequeno. Todos os parâmetros têm de ser numéricos e do mesmo tipo. Se algum parâmetro forNULL
, esta função devolveNULL
NVL(expr, null_default)
- Se
expr
não for nulo, devolveexpr
. Caso contrário, devolvenull_default
. A funçãoNVL
é um alias deIFNULL
.
Funções de data e hora
As seguintes funções permitem a manipulação de datas e horas para indicações de tempo UNIX, strings de data e tipos de dados TIMESTAMP. Para mais informações sobre como trabalhar com o tipo de dados TIMESTAMP, consulte Usar TIMESTAMP.
As funções de data e hora que funcionam com indicações de tempo UNIX operam com base na hora UNIX. As funções de data e hora devolvem valores com base no fuso horário UTC.
Sintaxe
Funções de data e hora | |
---|---|
CURRENT_DATE() |
Devolve a data atual no formato %Y-%m-%d . |
CURRENT_TIME() |
Devolve a hora atual do servidor no formato %H:%M:%S . |
CURRENT_TIMESTAMP() |
Devolve a hora atual do servidor no formato %Y-%m-%d %H:%M:%S . |
DATE() |
Devolve a data no formato %Y-%m-%d . |
DATE_ADD() |
Adiciona o intervalo especificado a um tipo de dados TIMESTAMP. |
DATEDIFF() |
Devolve o número de dias entre dois tipos de dados TIMESTAMP. |
DAY() |
Devolve o dia do mês como um número inteiro entre 1 e 31. |
DAYOFWEEK() |
Devolve o dia da semana como um número inteiro entre 1 (domingo) e 7 (sábado). |
DAYOFYEAR() |
Devolve o dia do ano como um número inteiro entre 1 e 366. |
FORMAT_UTC_USEC() |
Devolve uma indicação de tempo UNIX no formato YYYY-MM-DD HH:MM:SS.uuuuuu . |
HOUR() |
Devolve a hora de uma TIMESTAMP como um número inteiro entre 0 e 23. |
MINUTE() |
Devolve os minutos de uma DATA/HORA como um número inteiro entre 0 e 59. |
MONTH() |
Devolve o mês de uma TIMESTAMP como um número inteiro entre 1 e 12. |
MSEC_TO_TIMESTAMP() |
Converte uma indicação de tempo UNIX em milissegundos num formato de data/hora. |
NOW() |
Devolve a indicação de tempo UNIX atual em microssegundos. |
PARSE_UTC_USEC() |
Converte uma string de data numa indicação de tempo UNIX em microssegundos. |
QUARTER() |
Devolve o trimestre do ano de uma TIMESTAMP como um número inteiro entre 1 e 4. |
SEC_TO_TIMESTAMP() |
Converte uma indicação de tempo UNIX em segundos numa indicação de tempo. |
SECOND() |
Devolve os segundos de uma TIMESTAMP como um número inteiro entre 0 e 59. |
STRFTIME_UTC_USEC() |
Devolve uma string de data no formato date_format_str. |
TIME() |
Devolve uma DATA/HORA no formato %H:%M:%S . |
TIMESTAMP() |
Converta uma string de data num TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
Converte uma TIMESTAMP numa indicação de tempo UNIX em milissegundos. |
TIMESTAMP_TO_SEC() |
Converte uma data/hora num formato de data/hora Unix em segundos. |
TIMESTAMP_TO_USEC() |
Converte uma TIMESTAMP numa indicação de tempo UNIX em microssegundos. |
USEC_TO_TIMESTAMP() |
Converte uma indicação de tempo UNIX em microssegundos num formato de data/hora. |
UTC_USEC_TO_DAY() |
Desloca uma indicação de tempo UNIX em microssegundos para o início do dia em que ocorre. |
UTC_USEC_TO_HOUR() |
Desloca uma indicação de tempo UNIX em microssegundos para o início da hora em que ocorre. |
UTC_USEC_TO_MONTH() |
Desloca uma indicação de tempo UNIX em microssegundos para o início do mês em que ocorre. |
UTC_USEC_TO_WEEK() |
Devolve uma indicação de tempo UNIX em microssegundos que representa um dia da semana. |
UTC_USEC_TO_YEAR() |
Devolve uma indicação de tempo UNIX em microssegundos que representa o ano. |
WEEK() |
Devolve a semana de uma TIMESTAMP como um número inteiro entre 1 e 53. |
YEAR() |
Devolve o ano de uma data/hora. |
CURRENT_DATE()
Devolve uma string legível da data atual no formato
%Y-%m-%d
.Exemplo:
SELECT CURRENT_DATE();
Devoluções: 01-02-2013
CURRENT_TIME()
Devolve uma string legível por humanos da hora atual do servidor no formato
%H:%M:%S
.Exemplo:
SELECT CURRENT_TIME();
Regressos: 01:32:56
CURRENT_TIMESTAMP()
Devolve um tipo de dados TIMESTAMP da hora atual do servidor no formato
%Y-%m-%d %H:%M:%S
.Exemplo:
SELECT CURRENT_TIMESTAMP();
Devoluções: 2013-02-01 01:33:35 UTC
DATE(<timestamp>)
Devolve uma string legível de um tipo de dados TIMESTAMP no formato
%Y-%m-%d
.Exemplo:
SELECT DATE(TIMESTAMP('2012-10-01 02:03:04'));
Devoluções: 01/10/2012
DATE_ADD(<timestamp>,<interval>,
<interval_units>)Adiciona o intervalo especificado a um tipo de dados TIMESTAMP. Os valores
interval_units
possíveis incluemYEAR
,MONTH
,DAY
,HOUR
,MINUTE
eSECOND
. Seinterval
for um número negativo, o intervalo é subtraído ao tipo de dados TIMESTAMP.Exemplo:
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), 5, "YEAR");
Returns: 2017-10-01 02:03:04 UTC
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), -5, "YEAR");
Devoluções: 2007-10-01 02:03:04 UTC
DATEDIFF(<timestamp1>,<timestamp2>)
Devolve o número de dias entre dois tipos de dados TIMESTAMP. O resultado é positivo se o tipo de dados TIMESTAMP primeiro vier depois do tipo de dados TIMESTAMP segundo e, caso contrário, o resultado é negativo.
Exemplo:
SELECT DATEDIFF(TIMESTAMP('2012-10-02 05:23:48'), TIMESTAMP('2011-06-24 12:18:35'));
Devoluções: 466
Exemplo:
SELECT DATEDIFF(TIMESTAMP('2011-06-24 12:18:35'), TIMESTAMP('2012-10-02 05:23:48'));
Devoluções: -466
DAY(<timestamp>)
Devolve o dia do mês de um tipo de dados TIMESTAMP como um número inteiro entre 1 e 31, inclusive.
Exemplo:
SELECT DAY(TIMESTAMP('2012-10-02 05:23:48'));
Devoluções: 2
DAYOFWEEK(<timestamp>)
Devolve o dia da semana de um tipo de dados TIMESTAMP como um número inteiro entre 1 (domingo) e 7 (sábado), inclusive.
Exemplo:
SELECT DAYOFWEEK(TIMESTAMP("2012-10-01 02:03:04"));
Devoluções: 2
DAYOFYEAR(<timestamp>)
Devolve o dia do ano de um tipo de dados TIMESTAMP como um número inteiro entre 1 e 366, inclusive. O número inteiro 1 refere-se a 1 de janeiro.
Exemplo:
SELECT DAYOFYEAR(TIMESTAMP("2012-10-01 02:03:04"));
Devoluções: 275
FORMAT_UTC_USEC(<unix_timestamp>)
Devolve uma representação de string legível de uma data/hora UNIX no formato
YYYY-MM-DD HH:MM:SS.uuuuuu
.Exemplo:
SELECT FORMAT_UTC_USEC(1274259481071200);
Devoluções: 2010-05-19 08:58:01.071200
HOUR(<timestamp>)
Devolve a hora de um tipo de dados TIMESTAMP como um número inteiro entre 0 e 23, inclusive.
Exemplo:
SELECT HOUR(TIMESTAMP('2012-10-02 05:23:48'));
Devoluções: 5
MINUTE(<timestamp>)
Devolve os minutos de um tipo de dados TIMESTAMP como um número inteiro entre 0 e 59, inclusive.
Exemplo:
SELECT MINUTE(TIMESTAMP('2012-10-02 05:23:48'));
Devoluções: 23
MONTH(<timestamp>)
Devolve o mês de um tipo de dados TIMESTAMP como um número inteiro entre 1 e 12, inclusive.
Exemplo:
SELECT MONTH(TIMESTAMP('2012-10-02 05:23:48'));
Devoluções: 10
MSEC_TO_TIMESTAMP(<expr>)
- Converte uma indicação de tempo UNIX em milissegundos num tipo de dados TIMESTAMP.
Exemplo:
SELECT MSEC_TO_TIMESTAMP(1349053323000);
Devoluções: 2012-10-01 01:02:03 UTC
SELECT MSEC_TO_TIMESTAMP(1349053323000 + 1000)
Devoluções: 2012-10-01 01:02:04 UTC
NOW()
Devolve a indicação de tempo UNIX atual em microssegundos.
Exemplo:
SELECT NOW();
Devoluções: 1359685811687920
PARSE_UTC_USEC(<date_string>)
-
Converte uma string de data numa indicação de tempo UNIX em microssegundos.
date_string
tem de ter o formatoYYYY-MM-DD HH:MM:SS[.uuuuuu]
. A parte fracionária do segundo pode ter até 6 dígitos ou pode ser omitida.TIMESTAMP_TO_USEC é uma função equivalente que converte um argumento do tipo de dados TIMESTAMP em vez de uma string de data.
Exemplo:
SELECT PARSE_UTC_USEC("2012-10-01 02:03:04");
Devoluções: 1349056984000000
QUARTER(<timestamp>)
Devolve o trimestre do ano de um tipo de dados TIMESTAMP como um número inteiro entre 1 e 4, inclusive.
Exemplo:
SELECT QUARTER(TIMESTAMP("2012-10-01 02:03:04"));
Devoluções: 4
SEC_TO_TIMESTAMP(<expr>)
Converte uma indicação de tempo UNIX em segundos num tipo de dados TIMESTAMP.
Exemplo:
SELECT SEC_TO_TIMESTAMP(1355968987);
Devoluções: 2012-12-20 02:03:07 UTC
SELECT SEC_TO_TIMESTAMP(INTEGER(1355968984 + 3));
Devoluções: 2012-12-20 02:03:07 UTC
SECOND(<timestamp>)
-
Devolve os segundos de um tipo de dados TIMESTAMP como um número inteiro entre 0 e 59, inclusive.
Durante um segundo intercalar, o intervalo de números inteiros está entre 0 e 60, inclusive.
Exemplo:
SELECT SECOND(TIMESTAMP('2012-10-02 05:23:48'));
Devoluções: 48
STRFTIME_UTC_USEC(<unix_timestamp>,
<date_format_str>)-
Devolve uma string de data legível no formato date_format_str. date_format_str pode incluir carateres de pontuação relacionados com a data (como / e -) e carateres especiais aceites pela função strftime em C++ (como %d para o dia do mês).
Use as funções
UTC_USEC_TO_<function_name>
se planear agrupar os dados de consulta por intervalos de tempo, como obter todos os dados de um determinado mês, porque as funções são mais eficientes.Exemplo:
SELECT STRFTIME_UTC_USEC(1274259481071200, "%Y-%m-%d");
Devoluções: 19-05-2010
TIME(<timestamp>)
Devolve uma string legível de um tipo de dados TIMESTAMP no formato
%H:%M:%S
.Exemplo:
SELECT TIME(TIMESTAMP('2012-10-01 02:03:04'));
Devoluções: 02:03:04
TIMESTAMP(<date_string>)
Converter uma string de data num tipo de dados TIMESTAMP.
Exemplo:
SELECT TIMESTAMP("2012-10-01 01:02:03");
Devoluções: 2012-10-01 01:02:03 UTC
TIMESTAMP_TO_MSEC(<timestamp>)
Converte um tipo de dados TIMESTAMP numa indicação de tempo UNIX em milissegundos.
Exemplo:
SELECT TIMESTAMP_TO_MSEC(TIMESTAMP("2012-10-01 01:02:03"));
Devoluções: 1349053323000
TIMESTAMP_TO_SEC(<timestamp>)
- Converte um tipo de dados TIMESTAMP numa indicação de tempo UNIX em segundos.
Exemplo:
SELECT TIMESTAMP_TO_SEC(TIMESTAMP("2012-10-01 01:02:03"));
Devoluções: 1349053323
TIMESTAMP_TO_USEC(<timestamp>)
-
Converte um tipo de dados TIMESTAMP numa indicação de tempo UNIX em microssegundos.
PARSE_UTC_USEC é uma função equivalente que converte um argumento de string de dados em vez de um tipo de dados TIMESTAMP.
Exemplo:
SELECT TIMESTAMP_TO_USEC(TIMESTAMP("2012-10-01 01:02:03"));
Devoluções: 1349053323000000
USEC_TO_TIMESTAMP(<expr>)
Converte uma indicação de tempo UNIX em microssegundos num tipo de dados TIMESTAMP.
Exemplo:
SELECT USEC_TO_TIMESTAMP(1349053323000000);
Devoluções: 2012-10-01 01:02:03 UTC
SELECT USEC_TO_TIMESTAMP(1349053323000000 + 1000000)
Devoluções: 2012-10-01 01:02:04 UTC
UTC_USEC_TO_DAY(<unix_timestamp>)
-
Desloca uma indicação de tempo UNIX em microssegundos para o início do dia em que ocorre.
Por exemplo, se
unix_timestamp
ocorrer a 19 de maio às 08:58, esta função devolve uma data/hora UNIX para 19 de maio às 00:00 (meia-noite).Exemplo:
SELECT UTC_USEC_TO_DAY(1274259481071200);
Devoluções: 1274227200000000
UTC_USEC_TO_HOUR(<unix_timestamp>)
-
Desloca uma indicação de tempo UNIX em microssegundos para o início da hora em que ocorre.
Por exemplo, se
unix_timestamp
ocorrer às 08:58, esta função devolve uma indicação de tempo UNIX para as 08:00 do mesmo dia.Exemplo:
SELECT UTC_USEC_TO_HOUR(1274259481071200);
Devoluções: 1274256000000000
UTC_USEC_TO_MONTH(<unix_timestamp>)
-
Desloca uma indicação de tempo UNIX em microssegundos para o início do mês em que ocorre.
Por exemplo, se
unix_timestamp
ocorrer a 19 de março, esta função devolve uma data/hora UNIX para 1 de março do mesmo ano.Exemplo:
SELECT UTC_USEC_TO_MONTH(1274259481071200);
Devoluções: 1272672000000000
UTC_USEC_TO_WEEK(<unix_timestamp>,
<day_of_week>)-
Devolve uma indicação de tempo UNIX em microssegundos que representa um dia na semana do argumento
unix_timestamp
. Esta função seleciona dois argumentos: uma indicação de tempo UNIX em microssegundos e um dia da semana de 0 (domingo) a 6 (sábado).Por exemplo, se
unix_timestamp
ocorrer na sexta-feira, 11/04/2008, e definirday_of_week
como 2 (terça-feira), a função devolve uma indicação de tempo UNIX para terça-feira, 08/04/2008.Exemplo:
SELECT UTC_USEC_TO_WEEK(1207929480000000, 2) AS tuesday;
Devoluções: 1207612800000000
UTC_USEC_TO_YEAR(<unix_timestamp>)
-
Devolve uma indicação de tempo UNIX em microssegundos que representa o ano do argumento
unix_timestamp
.Por exemplo, se
unix_timestamp
ocorrer em 2010, a função devolve1274259481071200
, a representação em microssegundos de2010-01-01 00:00
.Exemplo:
SELECT UTC_USEC_TO_YEAR(1274259481071200);
Devoluções: 1262304000000000
WEEK(<timestamp>)
Devolve a semana de um tipo de dados TIMESTAMP como um número inteiro entre 1 e 53, inclusive.
As semanas começam ao domingo. Por isso, se o dia 1 de janeiro for num dia diferente de domingo, a semana 1 tem menos de 7 dias e o primeiro domingo do ano é o primeiro dia da semana 2.
Exemplo:
SELECT WEEK(TIMESTAMP('2014-12-31'));
Devoluções: 53
YEAR(<timestamp>)
- Devolve o ano de um tipo de dados TIMESTAMP.
Exemplo:
SELECT YEAR(TIMESTAMP('2012-10-02 05:23:48'));
Devoluções: 2012
Exemplos avançados
-
Converta resultados de data/hora de números inteiros num formato legível para humanos
A seguinte consulta encontra os 5 principais momentos em que ocorreram mais revisões da Wikipédia. Para apresentar os resultados num formato legível para humanos, use a função
FORMAT_UTC_USEC()
do BigQuery, que recebe uma data/hora, em microssegundos, como entrada. Esta consulta multiplica as indicações de tempo no formato POSIX da Wikipédia (em segundos) por 1000000 para converter o valor em microssegundos.Exemplo:
#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];
Devoluções:
+----------------------------+----------------+ | 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 data/hora
É útil usar funções de data e hora para agrupar os resultados da consulta em contentores correspondentes a anos, meses ou dias específicos. O exemplo seguinte usa a função
UTC_USEC_TO_MONTH()
para apresentar quantos carateres cada colaborador da Wikipédia usa nos respetivos comentários de revisões por mês.Exemplo:
#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;
Devoluções (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 ...
Funções de IP
As funções IP convertem endereços IP para e de forma legível.
Sintaxe
Funções de IP | |
---|---|
FORMAT_IP() |
Converte os 32 bits menos significativos de integer_value numa string de endereço IPv4 legível. |
PARSE_IP() |
Converte uma string que representa um endereço IPv4 num valor inteiro sem sinal. |
FORMAT_PACKED_IP() |
Devolve um endereço IP legível no formato
10.1.5.23 ou 2620:0:1009:1:216:36ff:feef:3f . |
PARSE_PACKED_IP() |
Devolve um endereço IP em BYTES. |
FORMAT_IP(integer_value)
- Converte os 32 bits menos significativos de
integer_value
na string de endereço IPv4 legível. Por exemplo,FORMAT_IP(1)
devolve a string'0.0.0.1'
. PARSE_IP(readable_ip)
- Converte uma string que representa um endereço IPv4 num valor inteiro sem sinal. Por exemplo,
PARSE_IP('0.0.0.1')
devolve1
. Se a string não for um endereço IPv4 válido,PARSE_IP
devolveNULL
.
O BigQuery suporta a escrita de endereços IPv4 e IPv6 em strings compactadas, como dados binários de 4 ou 16 bytes na ordem de bytes da rede. As funções descritas abaixo suportam a análise dos endereços para e a partir de um formato legível por humanos. Estas funções só funcionam em campos de strings com IPs.
Sintaxe
FORMAT_PACKED_IP(packed_ip)
Devolve um endereço IP legível no formato
10.1.5.23
ou2620:0:1009:1:216:36ff:feef:3f
. Exemplos:-
FORMAT_PACKED_IP('0123456789@ABCDE')
devoluções'3031:3233:3435:3637:3839:4041:4243:4445'
FORMAT_PACKED_IP('0123')
devoluções'48.49.50.51'
-
PARSE_PACKED_IP(readable_ip)
Devolve um endereço IP em BYTES. Se a string de entrada não for um endereço IPv4 ou IPv6 válido,
PARSE_PACKED_IP
vai devolverNULL
. Exemplos:PARSE_PACKED_IP('48.49.50.51')
devoluções'MDEyMw=='
PARSE_PACKED_IP('3031:3233:3435:3637:3839:4041:4243:4445')
devoluções'MDEyMzQ1Njc4OUBBQkNERQ=='
Funções JSON
As funções JSON do BigQuery permitem-lhe encontrar valores nos seus dados JSON armazenados através de expressões semelhantes a JSONPath.
O armazenamento de dados JSON pode ser mais flexível do que declarar todos os campos individuais no esquema da tabela, mas pode gerar custos mais elevados. Quando seleciona dados de uma string JSON, é-lhe cobrada a análise de toda a string, o que é mais caro do que se cada campo estivesse numa coluna separada. A consulta também é mais lenta, uma vez que toda a string tem de ser analisada no momento da consulta. No entanto, para esquemas ad hoc ou que mudam rapidamente, a flexibilidade do JSON pode compensar o custo adicional.
Use funções JSON em vez das funções de expressões regulares do BigQuery se estiver a trabalhar com dados estruturados, uma vez que as funções JSON são mais fáceis de usar.
Sintaxe
Funções JSON | |
---|---|
JSON_EXTRACT() |
Seleciona um valor de acordo com a expressão JSONPath e devolve uma string JSON. |
JSON_EXTRACT_SCALAR() |
Seleciona um valor de acordo com a expressão JSONPath e devolve um escalar JSON. |
JSON_EXTRACT(json, json_path)
-
Seleciona um valor em
json
de acordo com a expressão JSONPathjson_path
.json_path
tem de ser uma constante de string. Devolve o valor no formato de string JSON. JSON_EXTRACT_SCALAR(json, json_path)
-
Seleciona um valor em
json
de acordo com a expressão JSONPathjson_path
.json_path
tem de ser uma constante de string. Devolve um valor JSON escalar.
Operadores lógicos
Os operadores lógicos executam lógica binária ou ternária em expressões. A lógica binária devolve true
ou false
. A lógica ternária acomoda valores NULL
e devolve true
, false
ou NULL
.
Sintaxe
Operadores lógicos | |
---|---|
expr AND expr |
Devolve true se ambas as expressões forem verdadeiras. |
expr OR expr |
Devolve true se uma ou ambas as expressões forem verdadeiras. |
NOT expr |
Devolve true se a expressão for falsa. |
expr AND expr
- Devolve
true
se ambas as expressões forem verdadeiras. - Devolve
false
se uma ou ambas as expressões forem falsas. - Devolve
NULL
se ambas as expressões forem NULL ou se uma expressão for verdadeira e a outra for NULL.
- Devolve
expr OR expr
- Devolve
true
se uma ou ambas as expressões forem verdadeiras. - Devolve
false
se ambas as expressões forem falsas. - Devolve
NULL
se ambas as expressões forem NULL ou se uma expressão for falsa e a outra for NULL.
- Devolve
NOT expr
- Devolve
true
se a expressão for falsa. - Devolve
false
se a expressão for verdadeira. - Devolve
NULL
se a expressão for NULL.
Pode usar
NOT
com outras funções como um operador de negação. Por exemplo,NOT IN(expr1, expr2)
ouIS NOT NULL
.- Devolve
Funções matemáticas
As funções matemáticas recebem argumentos numéricos e devolvem um resultado numérico. Cada argumento pode ser um literal numérico ou um valor numérico devolvido por uma consulta. Se a função matemática for avaliada como um resultado indefinido, a operação devolve NULL
.
Sintaxe
Funções matemáticas | |
---|---|
ABS() |
Devolve o valor absoluto do argumento. |
ACOS() |
Devolve o arco cosseno do argumento. |
ACOSH() |
Devolve o arco cosseno hiperbólico do argumento. |
ASIN() |
Devolve o arco seno do argumento. |
ASINH() |
Devolve o arco seno hiperbólico do argumento. |
ATAN() |
Devolve a arcotangente do argumento. |
ATANH() |
Devolve a tangente hiperbólica inversa do argumento. |
ATAN2() |
Devolve a arcotangente dos dois argumentos. |
CEIL() |
Arredonda o argumento para o número inteiro mais próximo e devolve o valor arredondado. |
COS() |
Devolve o cosseno do argumento. |
COSH() |
Devolve o cosseno hiperbólico do argumento. |
DEGREES() |
Converte de radianos para graus. |
EXP() |
Devolve e elevado à potência do argumento. |
FLOOR() |
Arredonda o argumento para baixo, para o número inteiro mais próximo. |
LN() LOG()
|
Devolve o logaritmo natural do argumento. |
LOG2() |
Devolve o logaritmo de base 2 do argumento. |
LOG10() |
Devolve o logaritmo de base 10 do argumento. |
PI() |
Devolve a constante π. |
POW() |
Devolve o primeiro argumento elevado à potência do segundo argumento. |
RADIANS() |
Converte de graus para radianos. |
RAND() |
Devolve um valor de ponto flutuante aleatório no intervalo 0,0 <= valor < 1,0. |
ROUND() |
Arredonda o argumento para cima ou para baixo para o número inteiro mais próximo. |
SIN() |
Devolve o seno do argumento. |
SINH() |
Devolve o seno hiperbólico do argumento. |
SQRT() |
Devolve a raiz quadrada da expressão. |
TAN() |
Devolve a tangente do argumento. |
TANH() |
Devolve a tangente hiperbólica do argumento. |
ABS(numeric_expr)
- Devolve o valor absoluto do argumento.
ACOS(numeric_expr)
- Devolve o arco cosseno do argumento.
ACOSH(numeric_expr)
- Devolve o arco cosseno hiperbólico do argumento.
ASIN(numeric_expr)
- Devolve o arco seno do argumento.
ASINH(numeric_expr)
- Devolve o arco seno hiperbólico do argumento.
ATAN(numeric_expr)
- Devolve a arcotangente do argumento.
ATANH(numeric_expr)
- Devolve a arcotangente hiperbólica do argumento.
ATAN2(numeric_expr1, numeric_expr2)
- Devolve a arcotangente dos dois argumentos.
CEIL(numeric_expr)
- Arredonda o argumento para o número inteiro mais próximo e devolve o valor arredondado.
COS(numeric_expr)
- Devolve o cosseno do argumento.
COSH(numeric_expr)
- Devolve o cosseno hiperbólico do argumento.
DEGREES(numeric_expr)
- Devolve
numeric_expr
, convertido de radianos para graus. EXP(numeric_expr)
- Devolve o resultado da elevação da constante "e" (a base do logaritmo natural) à potência de numeric_expr.
FLOOR(numeric_expr)
- Arredonda o argumento para baixo, para o número inteiro mais próximo, e devolve o valor arredondado.
LN(numeric_expr)
LOG(numeric_expr)
- Devolve o logaritmo natural do argumento.
LOG2(numeric_expr)
- Devolve o logaritmo de base 2 do argumento.
LOG10(numeric_expr)
- Devolve o logaritmo de base 10 do argumento.
PI()
- Devolve a constante π. A função
PI()
requer parênteses para indicar que é uma função, mas não aceita argumentos nesses parênteses. Pode usarPI()
como uma constante com funções matemáticas e aritméticas. POW(numeric_expr1, numeric_expr2)
- Devolve o resultado da elevação de
numeric_expr1
à potência denumeric_expr2
. RADIANS(numeric_expr)
- Devolve
numeric_expr
, convertido de graus para radianos. (Tenha em atenção que π radianos equivalem a 180 graus.) RAND([int32_seed])
- Devolve um valor de vírgula flutuante aleatório no intervalo 0,0 <= valor < 1,0. Cada valor
int32_seed
gera sempre a mesma sequência de números aleatórios numa determinada consulta, desde que não use uma cláusulaLIMIT
. Seint32_seed
não for especificado, o BigQuery usa a data/hora atual como o valor inicial. ROUND(numeric_expr [, digits])
- Arredonda o argumento por excesso ou por defeito para o número inteiro mais próximo (ou, se especificado, para o número de dígitos especificado) e devolve o valor arredondado.
SIN(numeric_expr)
- Devolve o seno do argumento.
SINH(numeric_expr)
- Devolve o seno hiperbólico do argumento.
SQRT(numeric_expr)
- Devolve a raiz quadrada da expressão.
TAN(numeric_expr)
- Devolve a tangente do argumento.
TANH(numeric_expr)
- Devolve a tangente hiperbólica do argumento.
Exemplos avançados
-
Consulta de caixa limitadora
A seguinte consulta devolve uma coleção de pontos dentro de uma caixa delimitadora retangular centrada em São Francisco (37,46, -122,50).
Exemplo:
#legacySQL SELECT year, month, AVG(mean_temp) avg_temp, MIN(min_temperature) min_temp, MAX(max_temperature) max_temp FROM [weather_geo.table] WHERE /* Return values between a pair of */ /* latitude and longitude coordinates */ lat / 1000 > 37.46 AND lat / 1000 < 37.65 AND long / 1000 > -122.50 AND long / 1000 < -122.30 GROUP BY year, month ORDER BY year, month ASC;
-
Consulta de círculo delimitador aproximado
Devolve uma coleção de até 100 pontos num círculo aproximado determinado pela através da lei esférica dos cossenos, centrada em Denver, Colorado (39,73, -104,98). Esta consulta usa as funções matemáticas e trigonométricas do BigQuery, como
PI()
,SIN()
eCOS()
.Uma vez que a Terra não é uma esfera absoluta e a longitude + latitude converge nos polos, esta consulta devolve uma aproximação que pode ser útil para muitos tipos de dados.
Exemplo:
#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;
Funções de expressões regulares
O BigQuery oferece suporte para expressões regulares através da biblioteca re2. Consulte essa documentação para ver a respetiva sintaxe de expressões regulares.
Tenha em atenção que as expressões regulares são correspondências globais. Para começar a fazer a correspondência no início de uma palavra, tem de usar o caráter ^.
Sintaxe
Funções de expressões regulares | |
---|---|
REGEXP_MATCH() |
Devolve true se o argumento corresponder à expressão regular. |
REGEXP_EXTRACT() |
Devolve a parte do argumento que corresponde ao grupo de captura na expressão regular. |
REGEXP_REPLACE() |
Substitui uma substring que corresponde a uma expressão regular. |
REGEXP_MATCH('str', 'reg_exp')
Devolve true se str corresponder à expressão regular. Para a correspondência de strings sem expressões regulares, use CONTÉM em vez de REGEXP_MATCH.
Exemplo:
#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;
Devoluções:
+-------+-------+ | word | count | +-------+-------+ | ne'er | 42 | | we'll | 35 | | We'll | 33 | +-------+-------+
REGEXP_EXTRACT('str', 'reg_exp')
Devolve a parte de str que corresponde ao grupo de captura na expressão regular.
Exemplo:
#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;
Devoluções:
+----------+ | fragment | +----------+ | NULL | | Al'ce | | As'es | +----------+
REGEXP_REPLACE('orig_str', 'reg_exp', 'replace_str')
Devolve uma string em que qualquer substring de orig_str que corresponda a reg_exp é substituída por replace_str. Por exemplo, REGEXP_REPLACE ("Olá", "lá", "p") devolve Olá.
Exemplo:
#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;
Devoluções:
+---------------+ | expanded_word | +---------------+ | Whenever | | never | | nevertheless | | whenever | +---------------+
Exemplos avançados
-
Filtrar conjunto de resultados por correspondência de expressão regular
As funções de expressões regulares do BigQuery podem ser usadas para filtrar resultados numa cláusula
WHERE
, bem como para apresentar resultados na cláusulaSELECT
. O exemplo seguinte combina estes dois exemplos de utilização de expressões regulares numa única consulta.Exemplo:
#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 expressões regulares em dados de números inteiros ou de vírgula flutuante
Embora as funções de expressão regular do BigQuery só funcionem para dados de strings, é possível usar a função
STRING()
para converter dados de números inteiros ou de vírgula flutuante no formato de string. Neste exemplo,STRING()
é usado para converter o valor inteirocorpus_date
numa string, que é alterada porREGEXP_REPLACE
.Exemplo:
#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;
Funções de string
As funções de string operam em dados de string. As constantes de string têm de estar entre aspas simples ou duplas. As funções de string são sensíveis a maiúsculas e minúsculas por predefinição.
Pode anexar IGNORE CASE
ao final de uma consulta para ativar a correspondência
insensível a maiúsculas e minúsculas. IGNORE CASE
só funciona com carateres ASCII e apenas no nível superior da consulta.
Os carateres universais não são suportados nestas funções. Para usar a funcionalidade de expressões regulares, use funções de expressões regulares.
Sintaxe
Funções de string | |
---|---|
CONCAT() |
Devolve a concatenação de duas ou mais strings ou NULL se algum dos valores for NULL. |
expr CONTAINS 'str' |
Devolve true se expr contiver o argumento de string especificado. |
INSTR() |
Devolve o índice baseado em um da primeira ocorrência de uma string. |
LEFT() |
Devolve os carateres mais à esquerda de uma string. |
LENGTH() |
Devolve o comprimento da string. |
LOWER() |
Devolve a string original com todos os carateres em minúsculas. |
LPAD() |
Insere carateres à esquerda de uma string. |
LTRIM() |
Remove carateres do lado esquerdo de uma string. |
REPLACE() |
Substitui todas as ocorrências de uma subcadeia de carateres. |
RIGHT() |
Devolve os carateres mais à direita de uma string. |
RPAD() |
Insere carateres no lado direito de uma string. |
RTRIM() |
Remove carateres finais do lado direito de uma string. |
SPLIT() |
Divide uma string em substrings repetidas. |
SUBSTR() |
Devolve uma substring … |
UPPER() |
Devolve a string original com todos os carateres em maiúsculas. |
CONCAT('str1', 'str2', '...')
str1 + str2 + ...- Devolve a concatenação de duas ou mais strings ou NULL se algum dos valores for NULL. Exemplo: se
str1
forJava
estr2
forScript
,CONCAT
devolveJavaScript
. expr CONTAINS 'str'
- Devolve
true
seexpr
contiver o argumento de string especificado. Esta é uma comparação sensível a maiúsculas e minúsculas. INSTR('str1', 'str2')
- Devolve o índice baseado em um da primeira ocorrência de str2 em str1 ou devolve 0 se str2 não ocorrer em str1.
LEFT('str', numeric_expr)
- Devolve os carateres mais à esquerda de numeric_expr de
str
. Se o número for superior a str, é devolvida a string completa. Exemplo:LEFT('seattle', 3)
devolvesea
. LENGTH('str')
- Devolve um valor numérico para o comprimento da string. Exemplo: se
str
for'123456'
,LENGTH
devolve6
. LOWER('str')
- Devolve a string original com todos os carateres em minúsculas.
LPAD('str1', numeric_expr, 'str2')
- Preenche
str1
à esquerda comstr2
, repetindostr2
até que a string de resultado tenha exatamentenumeric_expr
carateres. Exemplo:LPAD('1', 7, '?')
devolve??????1
. LTRIM('str1' [, str2])
-
Remove carateres do lado esquerdo de str1. Se str2 for omitido,
LTRIM
remove espaços do lado esquerdo de str1. Caso contrário,LTRIM
remove todos os carateres em str2 do lado esquerdo de str1 (sensível a maiúsculas e minúsculas).Exemplos:
SELECT LTRIM("Say hello", "yaS")
devolve" hello"
.SELECT LTRIM("Say hello", " ySa")
devolve"hello"
. REPLACE('str1', 'str2', 'str3')
-
Substitui todas as instâncias de str2 em str1 por str3.
RIGHT('str', numeric_expr)
- Devolve os numeric_expr carateres mais à direita de
str
. Se o número for maior do que o comprimento da string, é devolvida a string completa. Exemplo:RIGHT('kirkland', 4)
devolveland
. RPAD('str1', numeric_expr, 'str2')
- Preenche
str1
à direita comstr2
, repetindostr2
até que a string de resultado tenha exatamentenumeric_expr
carateres. Exemplo:RPAD('1', 7, '?')
devolve1??????
. RTRIM('str1' [, str2])
-
Remove os carateres finais do lado direito de str1. Se str2 for omitido,
RTRIM
remove os espaços finais de str1. Caso contrário,RTRIM
remove todos os carateres em str2 do lado direito de str1 (sensível a maiúsculas e minúsculas).Exemplos:
SELECT RTRIM("Say hello", "leo")
devolve"Say h"
.SELECT RTRIM("Say hello ", " hloe")
devolve"Say"
. SPLIT('str' [, 'delimiter'])
- Divide uma string em substrings repetidas. Se
delimiter
for especificado, a funçãoSPLIT
dividestr
em substrings, usandodelimiter
como delimitador. SUBSTR('str', index [, max_len])
- Devolve uma substring de
str
, começando emindex
. Se for usado o parâmetromax_len
opcional, a string devolvida tem um comprimento máximo demax_len
carateres. A contagem começa em 1, pelo que o primeiro caráter na string está na posição 1 (não zero). Seindex
for5
, a substring começa com o 5.º caráter a partir da esquerda emstr
. Seindex
for-4
, a substring começa com o 4.º caráter a partir da direita emstr
. Exemplo:SUBSTR('awesome', -4, 4)
devolve a substringsome
. UPPER('str')
- Devolve a string original com todos os carateres em maiúsculas.
Escape de carateres especiais em strings
Para ignorar carateres especiais, use um dos seguintes métodos:
- Use a notação
'\xDD'
, em que'\x'
é seguido pela representação hexadecimal de dois dígitos do caráter. - Use uma barra de escape antes de barras, aspas simples e aspas duplas.
- Use sequências de estilo C (
'\a', '\b', '\f', '\n', '\r', '\t',
e'\v'
) para outros carateres.
Alguns exemplos de carateres 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
Funções de carateres universais de tabelas
As funções com carateres universais de tabelas são uma forma conveniente de consultar dados de um conjunto específico de tabelas. Uma função de caráter universal de tabela é equivalente a uma união separada por vírgulas de todas as tabelas correspondentes à função de caráter universal. Quando usa uma função com carateres universais de tabela, o BigQuery só acede e cobra pelas tabelas que correspondem ao caráter universal. As funções de carateres universais de tabelas são especificadas na cláusula FROM da consulta.
Se usar funções de caráter universal de tabelas numa consulta, as funções já não têm de estar entre parênteses. Por exemplo, alguns dos seguintes exemplos usam parênteses, enquanto outros não.
Não é possível colocar em cache os resultados das consultas de várias tabelas que usem uma função de caráter universal (mesmo que a opção Usar resultados em cache esteja selecionada). Se executar várias vezes a mesma consulta com um caráter universal, tem de pagar cada consulta.
Sintaxe
Funções de carateres universais de tabelas | |
---|---|
TABLE_DATE_RANGE() |
Consultar várias tabelas diárias que abrangem um intervalo de datas. |
TABLE_DATE_RANGE_STRICT() |
Consultas a várias tabelas diárias que abrangem um intervalo de datas, sem datas em falta. |
TABLE_QUERY() |
Consulta tabelas cujos nomes correspondem a um predicado especificado. |
TABLE_DATE_RANGE(prefix, timestamp1, timestamp2)
-
Consulta tabelas diárias que se sobrepõem ao intervalo de tempo entre
<timestamp1>
e<timestamp2>
.Os nomes das tabelas têm de ter o seguinte formato:
<prefix><day>
, em que<day>
está no formatoYYYYMMDD
.Pode usar funções de data e hora para gerar os parâmetros de data/hora. Por exemplo:
TIMESTAMP('2012-10-01 02:03:04')
DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')
Exemplo: obter tabelas entre dois dias
Este exemplo pressupõe a existência das seguintes tabelas:
- 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
Corresponde às seguintes tabelas:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
Exemplo: obter tabelas num intervalo de dois dias até "agora"
Este exemplo pressupõe que as seguintes tabelas existem num projeto denominado
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
Corresponde às seguintes tabelas:
- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
TABLE_DATE_RANGE_STRICT(prefix, timestamp1, timestamp2)
-
Esta função é equivalente a
TABLE_DATE_RANGE
. A única diferença é que, se faltar alguma tabela diária na sequência, a funçãoTABLE_DATE_RANGE_STRICT
falha e devolve um erroNot Found: Table <table_name>
.Exemplo: erro na tabela em falta
Este exemplo pressupõe a existência das seguintes tabelas:
- 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
O exemplo acima devolve um erro "Não encontrado" para a tabela "people20140326".
TABLE_QUERY(dataset, expr)
-
Consulta tabelas cujos nomes correspondem ao
expr
fornecido. O parâmetroexpr
tem de ser representado como uma string e tem de conter uma expressão a avaliar. Por exemplo,'length(table_id) < 3'
.Exemplo: corresponder a tabelas cujos nomes contenham "oo" e tenham um comprimento superior a 4
Este exemplo pressupõe a existência das seguintes tabelas:
- 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'))
Corresponde às seguintes tabelas:
- mydata.ooze
- mydata.spoon
Exemplo: corresponder a tabelas cujos nomes começam por "boo", seguidos de 3 a 5 dígitos numéricos
Este exemplo pressupõe que as seguintes tabelas existem num projeto denominado
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}")')
Corresponde às seguintes tabelas:
- mydata.book418
- mydata.boom12345
Funções de URL
Sintaxe
Funções de URL | |
---|---|
HOST() |
Dado um URL, devolve o nome do anfitrião como uma string. |
DOMAIN() |
Dado um URL, devolve o domínio como uma string. |
TLD() |
Dado um URL, devolve o domínio de nível superior mais qualquer domínio de país no URL. |
HOST('url_str')
- Dado um URL, devolve o nome do anfitrião como uma string. Exemplo: HOST('http://www.google.com:80/index.html') devolve "www.google.com"
DOMAIN('url_str')
- Dado um URL, devolve o domínio como uma string. Exemplo: DOMAIN('http://www.google.com:80/index.html') devolve "google.com".
TLD('url_str')
- Dado um URL, devolve o domínio de nível superior mais qualquer domínio de país no URL. Exemplo: TLD('http://www.google.com:80/index.html') devolve ".com". TLD('http://www.google.co.uk:80/index.html') devolve ".co.uk".
Notas:
- Estas funções não realizam uma pesquisa de DNS inversa. Por isso, se chamar estas funções através de um endereço IP, as funções devolvem segmentos do endereço IP em vez de segmentos do nome do anfitrião.
- Todas as funções de análise de URL esperam carateres em minúsculas. Os carateres em maiúsculas no URL resultam num resultado NULL ou incorreto. Considere transmitir a entrada a esta função através de LOWER() se os seus dados tiverem letras maiúsculas e minúsculas.
Exemplo avançado
Analise nomes de domínios a partir de dados de URLs
Esta consulta usa a função
DOMAIN()
para devolver os domínios mais populares listados como páginas iniciais de repositórios no GitHub. Repare na utilização de HAVING para filtrar registos através do resultado da função DOMAIN()
. Esta
é uma função útil para determinar informações de referenciadores a partir de dados de URL.
Exemplos:
#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;
Devoluções:
+-----------------+----------------+ | user_domain | activity_count | +-----------------+----------------+ | github.com | 281879 | | google.com | 34769 | | khanacademy.org | 17316 | | sourceforge.net | 15103 | | mozilla.org | 14091 | +-----------------+----------------+
Para analisar especificamente as informações de TLD, use a função TLD()
. Este exemplo apresenta os TLDs principais que não estão numa lista de exemplos comuns.
#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;
Devoluções:
+----------+----------------+ | user_tld | activity_count | +----------+----------------+ | .de | 22934 | | .io | 17528 | | .me | 13652 | | .fr | 12895 | | .co.uk | 9135 | +----------+----------------+
Funções de janela
As funções de janela, também conhecidas como funções analíticas, permitem cálculos num subconjunto específico, ou "janela", de um conjunto de resultados. As funções de janela facilitam a criação de relatórios que incluem estatísticas complexas, como médias móveis e totais acumulados.
Cada função de janela requer uma cláusula OVER
que especifique
o início e o fim da janela. Os três componentes da cláusula OVER
(partição, ordenação e enquadramento) oferecem um controlo adicional
sobre a janela. A partição permite-lhe dividir os dados de entrada em
grupos lógicos com uma caraterística comum. A ordenação permite-lhe
ordenar os resultados numa partição. A enquadramento permite-lhe criar um quadro de janela deslizante numa partição que se move relativamente à linha atual. Pode configurar o tamanho da janela móvel com base num número de linhas ou num intervalo de valores, como um intervalo de tempo.
#legacySQL SELECT <window_function> OVER ( [PARTITION BY <expr>] [ORDER BY <expr> [ASC | DESC]] [<window-frame-clause>] )
PARTITION BY
- Define a partição base sobre a qual esta função opera.
Especifique um ou mais nomes de colunas separados por vírgulas. É criada uma partição para cada conjunto distinto de valores para estas colunas, semelhante a uma cláusula
GROUP BY
. SePARTITION BY
for omitido, a partição base é todas as linhas na entrada para a função de janela. - A cláusula
PARTITION BY
também permite que as funções de janela particionem dados e paralelizem a execução. Se quiser usar uma função de janela comallowLargeResults
ou se pretender aplicar mais junções ou agregações ao resultado da função de janela, usePARTITION BY
para paralelizar a execução.
Não é possível usar as cláusulas JOIN EACH
eGROUP EACH BY
no resultado de funções de janela. Para gerar resultados de consultas grandes quando usar funções de janela, tem de usarPARTITION BY
.ORDER BY
- Ordena a partição. Se
ORDER BY
estiver ausente, não existe garantia de qualquer ordem de ordenação predefinida. A ordenação ocorre ao nível da partição, antes de ser aplicada qualquer cláusula de quadro de janela. Se especificar uma janelaRANGE
, deve adicionar uma cláusulaORDER BY
. A ordem predefinida éASC
. ORDER BY
é opcional em alguns casos, mas determinadas funções de janela, como rank() ou dense_rank(), requerem a cláusula.- Se usar
ORDER BY
sem especificarROWS
ouRANGE
,ORDER BY
implica que a janela estende-se desde o início da partição até à linha atual. Na ausência de uma cláusulaORDER BY
, a janela é a partição inteira. <window-frame-clause>
-
{ROWS | RANGE} {BETWEEN <start> AND <end> | <start> | <end>}
- Um subconjunto da partição sobre a qual operar. Pode ter o mesmo tamanho
que a partição ou ser mais pequena. Se usar
ORDER BY
sem umwindow-frame-clause
, o frame da janela predefinido éRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. Se omitirORDER BY
ewindow-frame-clause
, a frame da janela predefinida é a partição inteira.ROWS
- Define uma janela em termos de posição da linha, relativa à linha atual. Por exemplo, para adicionar uma coluna que mostre a soma dos valores de salário das 5 linhas anteriores, consultariaSUM(salary) OVER (ROWS BETWEEN 5 PRECEDING AND CURRENT ROW)
. O conjunto de linhas inclui normalmente a linha atual, mas isso não é obrigatório.RANGE
: define uma janela em termos de um intervalo de valores numa determinada coluna, relativamente ao valor dessa coluna na linha atual. Funciona apenas com números e datas, em que os valores de data são números inteiros simples (microssegundos desde a época). As linhas adjacentes com o mesmo valor são denominadas linhas pares. As linhas semelhantes deCURRENT ROW
estão incluídas num intervalo que especificaCURRENT ROW
. Por exemplo, se especificar que o fim do período éCURRENT ROW
e a linha seguinte no período tiver o mesmo valor, esta é incluída no cálculo da função.BETWEEN <start> AND <end>
– Um intervalo, incluindo as linhas de início e fim. O intervalo não tem de incluir a linha atual, mas<start>
tem de preceder ou ser igual a<end>
.<start>
- Especifica o desvio de início para esta janela, relativamente à linha atual. As seguintes opções são suportadas: onde{UNBOUNDED PRECEDING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}
<expr>
é um número inteiro positivo,PRECEDING
indica um número de linha ou um valor de intervalo anterior eFOLLOWING
indica um número de linha ou um valor de intervalo posterior.UNBOUNDED PRECEDING
significa a primeira linha da partição. Se o início preceder o intervalo, é definido como a primeira linha da partição.<end>
: especifica o deslocamento final desta janela em relação à linha atual. As seguintes opções são suportadas: onde{UNBOUNDED FOLLOWING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}
<expr>
é um número inteiro positivo,PRECEDING
indica um número de linha ou um valor de intervalo anterior eFOLLOWING
indica um número de linha ou um valor de intervalo posterior.UNBOUNDED FOLLOWING
significa a última linha da partição. Se o fim estiver além do fim da janela, é definido como a última linha da partição.
Ao contrário das funções de agregação, que reduzem muitas linhas de entrada a uma linha de saída, as funções de janela devolvem uma linha de saída para cada linha de entrada.
Esta funcionalidade facilita a criação de consultas que calculam os totais acumulados e as médias móveis. Por exemplo, a seguinte consulta devolve um total acumulado
para um pequeno conjunto de dados de cinco linhas definido por declarações 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 devolvido:
+------+-------+--------------+ | name | value | RunningTotal | +------+-------+--------------+ | a | 0 | 0 | | b | 1 | 1 | | c | 2 | 3 | | d | 3 | 6 | | e | 4 | 10 | +------+-------+--------------+
O exemplo seguinte calcula uma média móvel dos valores na linha atual e na linha anterior. A moldura da janela é composta por duas linhas que se movem com a linha atual.
#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 devolvido:
+------+-------+---------------+ | name | value | MovingAverage | +------+-------+---------------+ | a | 0 | 0.0 | | b | 1 | 0.5 | | c | 2 | 1.5 | | d | 3 | 2.5 | | e | 4 | 3.5 | +------+-------+---------------+
Sintaxe
Funções de janela | |
---|---|
AVG() COUNT(*) COUNT([DISTINCT]) MAX() MIN() STDDEV() SUM() |
A mesma operação que as funções de agregação correspondentes, mas são calculadas num período definido pela cláusula OVER. |
CUME_DIST() |
Devolve um valor duplo que indica a distribuição cumulativa de um valor num grupo de valores… |
DENSE_RANK() |
Devolve a classificação inteira de um valor num grupo de valores. |
FIRST_VALUE() |
Devolve o primeiro valor do campo especificado na janela. |
LAG() |
Permite-lhe ler dados de uma linha anterior numa janela. |
LAST_VALUE() |
Devolve o último valor do campo especificado na janela. |
LEAD() |
Permite-lhe ler dados de uma linha seguinte numa janela. |
NTH_VALUE() |
Devolve o valor de <expr> na posição
<n> da moldura da janela ...
|
NTILE() |
Divide a janela no número especificado de grupos. |
PERCENT_RANK() |
Devolve a classificação da linha atual, relativamente às outras linhas na partição. |
PERCENTILE_CONT() |
Devolve um valor interpolado que seria mapeado para o argumento de percentil relativamente à janela ... |
PERCENTILE_DISC() |
Devolve o valor mais próximo da percentagem do argumento na janela. |
RANK() |
Devolve a classificação inteira de um valor num grupo de valores. |
RATIO_TO_REPORT() |
Devolve a proporção de cada valor em relação à soma dos valores. |
ROW_NUMBER() |
Devolve o número da linha atual do resultado da consulta na janela. |
-
AVG(numeric_expr)
COUNT(*)
COUNT([DISTINCT] field)
MAX(field)
MIN(field)
STDDEV(numeric_expr)
SUM(field)
-
Estas funções de janela executam a mesma operação que as
funções de agregação correspondentes, mas são calculadas
numa janela definida pela cláusula OVER.
Outra diferença significativa é que a função
COUNT([DISTINCT] field)
produz resultados exatos quando usada como uma função de janela, com um comportamento semelhante à função agregadaEXACT_COUNT_DISTINCT()
.Na consulta de exemplo, a cláusula
ORDER BY
faz com que a janela seja calculada a partir do início da partição até à linha atual, o que gera uma soma cumulativa para esse ano.#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
Devoluções:
corpus_date corpus word_count annual_total 0 vários 37 37 0 sonetos 157 194 1590 2kinghenryvi 18 18 1590 1kinghenryvi 24 42 1590 3kinghenryvi 40 82 CUME_DIST()
-
Devolve um valor duplo que indica a distribuição cumulativa de um valor num grupo de valores, calculado através da fórmula
<number of rows preceding or tied with the current row> / <total rows>
. Os valores empatados devolvem o mesmo valor de distribuição cumulativa.Esta função de janela requer
ORDER BY
na 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
Devoluções:
palavra word_count cume_dist lenço 29 0.2 satisfação 5 0,4 descontentamento 4 0,8 instrumentos 4 0,8 circunstância 3 1,0 DENSE_RANK()
-
Devolve a classificação inteira de um valor num grupo de valores. A classificação é calculada com base em comparações com outros valores no grupo.
Os valores empatados são apresentados com a mesma classificação. A classificação do valor seguinte é incrementada em 1. Por exemplo, se dois valores ficarem empatados no 2.º lugar, o valor seguinte na classificação é o 3.º. Se preferir uma lacuna na lista de classificação, use rank().
Esta função de janela requer
ORDER BY
na cláusulaOVER
. Devoluções:#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
palavra word_count dense_rank lenço 29 1 satisfação 5 2 descontentamento 4 3 instrumentos 4 3 circunstância 3 4 FIRST_VALUE(<field_name>)
-
Devolve o primeiro valor de
<field_name>
na janela. Devoluções:#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
palavra word_count fv imperfeitamente 1 imperfeitamente LAG(<expr>[, <offset>[, <default_value>]])
-
Permite-lhe ler dados de uma linha anterior numa janela. Especificamente,
LAG()
devolve o valor de<expr>
para a linha localizada<offset>
linhas antes da linha atual. Se a linha não existir,<default_value>
é devolvido.#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
Devoluções:
palavra word_count atraso lenço 29 nulo satisfação 5 lenço descontentamento 4 satisfação instrumentos 4 descontentamento circunstância 3 instrumentos LAST_VALUE(<field_name>)
-
Devolve o último valor de
<field_name>
na janela.#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
Devoluções:
palavra word_count lv imperfeitamente 1 imperfeitamente LEAD(<expr>[, <offset>[, <default_value>]])
-
Permite-lhe ler dados de uma linha seguinte numa janela. Especificamente,
LEAD()
devolve o valor de<expr>
para a linha localizada<offset>
linhas após a linha atual. Se a linha não existir,<default_value>
é devolvido. Devoluções:#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
palavra word_count lead lenço 29 satisfação satisfação 5 descontentamento descontentamento 4 instrumentos instrumentos 4 circunstância circunstância 3 nulo NTH_VALUE(<expr>, <n>)
-
Devolve o valor de
<expr>
na posição<n>
da moldura da janela, onde<n>
é um índice baseado em um. NTILE(<num_buckets>)
-
Divide uma sequência de linhas em
<num_buckets>
recipientes e atribui um número de recipiente correspondente, como um número inteiro, a cada linha. A funçãontile()
atribui os números dos grupos de forma tão igual quanto possível e devolve um valor de 1 a<num_buckets>
para cada linha. Devoluções:#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
palavra word_count ntile lenço 29 1 satisfação 5 1 descontentamento 4 1 instrumentos 4 2 circunstância 3 2 PERCENT_RANK()
-
Devolve a classificação da linha atual, relativamente às outras linhas na partição. Os valores devolvidos variam entre 0 e 1, inclusive. O primeiro valor devolvido é 0,0.
Esta função de janela requer
ORDER BY
na cláusulaOVER
. Devoluções:#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
palavra word_count p_rank lenço 29 0.0 satisfação 5 0,25 descontentamento 4 0,5 instrumentos 4 0,5 circunstância 3 1,0 PERCENTILE_CONT(<percentile>)
-
Devolve um valor interpolado que seria mapeado para o argumento percentil relativamente à janela, depois de os ordenar de acordo com a cláusula
ORDER BY
.<percentile>
tem de ser um número entre 0 e 1.Esta função de janela requer
ORDER BY
na cláusulaOVER
. Devoluções:#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
palavra word_count p_cont lenço 29 4 satisfação 5 4 descontentamento 4 4 instrumentos 4 4 circunstância 3 4 PERCENTILE_DISC(<percentile>)
-
Devolve o valor mais próximo da percentagem do argumento na janela.
<percentile>
tem de ser um número entre 0 e 1.Esta função de janela requer
ORDER BY
na cláusulaOVER
. Devoluções:#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
palavra word_count p_disc lenço 29 4 satisfação 5 4 descontentamento 4 4 instrumentos 4 4 circunstância 3 4 RANK()
-
Devolve a classificação inteira de um valor num grupo de valores. A classificação é calculada com base em comparações com outros valores no grupo.
Os valores empatados são apresentados com a mesma classificação. A classificação do valor seguinte é incrementada de acordo com o número de valores empatados que ocorreram antes. Por exemplo, se dois valores ficarem empatados no 2.º lugar, o valor seguinte na classificação é 4 e não 3. Se preferir que não existam lacunas na lista de classificação, use dense_rank().
Esta função de janela requer
ORDER BY
na cláusulaOVER
. Devoluções:#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
palavra word_count classificação lenço 29 1 satisfação 5 2 descontentamento 4 3 instrumentos 4 3 circunstância 3 5 RATIO_TO_REPORT(<column>)
-
Devolve a proporção de cada valor em relação à soma dos valores, como um valor de vírgula flutuante entre 0 e 1.
Devoluções:#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
palavra word_count r_to_r lenço 29 0,6444444444444445 satisfação 5 0,1111111111111111 descontentamento 4 0,08888888888888889 instrumentos 4 0,08888888888888889 circunstância 3 0,06666666666666667 ROW_NUMBER()
-
Devolve o número da linha atual do resultado da consulta na janela, começando por 1.
Devoluções:#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
palavra word_count row_num lenço 29 1 satisfação 5 2 descontentamento 4 3 instrumentos 4 4 circunstância 3 5
Outras funções
Sintaxe
Outras funções | |
---|---|
CASE WHEN ... THEN |
Use CASE para escolher entre duas ou mais expressões alternativas na sua consulta. |
CURRENT_USER() |
Devolve o endereço de email do utilizador que está a executar a consulta. |
EVERY() |
Devolve verdadeiro se o argumento for verdadeiro para todas as respetivas entradas. |
FROM_BASE64() |
Converte a string de entrada codificada em base64 no formato BYTES. |
HASH() |
Calcula e devolve um valor de hash com sinal de 64 bits… |
FARM_FINGERPRINT() |
Calcula e devolve um valor de impressão digital com sinal de 64 bits ... |
IF() |
Se o primeiro argumento for verdadeiro, devolve o segundo argumento; caso contrário, devolve o terceiro argumento. |
POSITION() |
Devolve a posição sequencial baseada em 1 do argumento. |
SHA1() |
Devolve um hash SHA1 no formato BYTES. |
SOME() |
Devolve verdadeiro se o argumento for verdadeiro para, pelo menos, uma das respetivas entradas. |
TO_BASE64() |
Converte o argumento BYTES numa string codificada em base-64. |
CASE WHEN when_expr1 THEN then_expr1
WHEN when_expr2 THEN then_expr2 ...
ELSE else_expr END- Use CASE para escolher entre duas ou mais expressões alternativas na sua consulta. WHEN As expressões têm de ser booleanas e todas as expressões nas cláusulas THEN e na cláusula ELSE têm de ser tipos compatíveis.
CURRENT_USER()
- Devolve o endereço de email do utilizador que está a executar a consulta.
EVERY(<condition>)
- Devolve
true
secondition
for verdadeiro para todas as respetivas entradas. Quando usada com a cláusulaOMIT IF
, esta função é útil para consultas que envolvem campos repetidos. FROM_BASE64(<str>)
- Converte a string de entrada codificada em base64
str
no formato BYTES. Para converter BYTES numa string com codificação base64, use TO_BASE64(). HASH(expr)
- Calcula e devolve um valor de hash com sinal de 64 bits dos bytes de
expr
, conforme definido pela biblioteca CityHash (versão 1.0.3). Qualquer expressão de string ou número inteiro é suportada e a função respeitaIGNORE CASE
para strings, devolvendo valores independentes de maiúsculas e minúsculas. FARM_FINGERPRINT(expr)
- Calcula e devolve um valor de impressão digital assinado de 64 bits da entrada
STRING
ouBYTES
através da funçãoFingerprint64
da biblioteca FarmHash de código aberto. O resultado desta função para uma entrada específica nunca muda e corresponde ao resultado da funçãoFARM_FINGERPRINT
quando usa o GoogleSQL. RespeitaIGNORE CASE
para strings, devolvendo valores independentes de maiúsculas e minúsculas. IF(condition, true_return, false_return)
- Devolve
true_return
oufalse_return
, consoantecondition
seja verdadeiro ou falso. Os valores devolvidos podem ser literais ou valores derivados de campos, mas têm de ser do mesmo tipo de dados. Os valores derivados de campos não têm de ser incluídos na cláusulaSELECT
. POSITION(field)
- Devolve a posição sequencial baseada em um de field num conjunto de campos repetidos.
SHA1(<str>)
- Devolve um hash SHA1, no formato BYTES, da string de entrada
str
. Pode converter o resultado em base64 através de TO_BASE64(). Por exemplo:#legacySQL SELECT TO_BASE64(SHA1(corpus)) FROM [bigquery-public-data:samples.shakespeare] LIMIT 100;
SOME(<condition>)
- Devolve
true
secondition
for verdadeiro para, pelo menos, uma das respetivas entradas. Quando usada com a cláusulaOMIT IF
, esta função é útil para consultas que envolvem campos repetidos. TO_BASE64(<bin_data>)
- Converte a entrada BYTES
bin_data
numa string codificada em base64. Por exemplo: Para converter uma string codificada em base64 para BYTES, use FROM_BASE64().#legacySQL SELECT TO_BASE64(SHA1(title)) FROM [bigquery-public-data:samples.wikipedia] LIMIT 100;
Exemplos avançados
-
Agrupar resultados em categorias usando condições
A consulta seguinte usa um bloco
CASE/WHEN
para agrupar os resultados em categorias de "região" com base numa lista de estados. Se o estado não aparecer como uma opção numa das declaraçõesWHEN
, o valor do estado é predefinido como "Nenhum".Exemplo:
#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;
Devoluções:
+--------+--------------------+--------------------+-------+------+ | 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 uma tabela dinâmica
Use declarações condicionais para organizar os resultados de uma consulta subselecionada em linhas e colunas. No exemplo abaixo, os resultados de uma pesquisa dos artigos da Wikipédia mais revistos que começam com o valor "Google" estão organizados em colunas onde as contagens de revisões são apresentadas se cumprirem vários critérios.
Exemplo:
#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 );
Devoluções:
+---------------+--------+------+ | 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 a função HASH para selecionar uma amostra aleatória dos seus dados
Algumas consultas podem fornecer um resultado útil através da subamostragem aleatória do conjunto de resultados. Para obter uma amostragem aleatória de valores, use a função
HASH
para devolver resultados em que o módulo "n" do hash é igual a zero.Por exemplo, a seguinte consulta encontra o
HASH()
do valor "title" e, em seguida, verifica se esse valor módulo "2" é zero. Isto deve resultar em cerca de 50% dos valores etiquetados como "amostrados". Para criar uma amostra de menos valores, aumente o valor da operação de módulo de "2" para algo maior. A consulta usa a funçãoABS
em combinação comHASH
, porqueHASH
pode devolver valores negativos, e o operador módulo num valor negativo produz um valor negativo.Exemplo:
#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;