Analisar dados usando a sintaxe pipe
Neste tutorial, mostramos como escrever consultas usando a sintaxe de pipe para analisar dados.
A sintaxe de pipe é uma extensão do GoogleSQL que oferece suporte a uma estrutura de consulta linear projetada para facilitar a leitura, a gravação e a manutenção das consultas.
A sintaxe de barra vertical consiste no símbolo |>
, um nome de operador de barra vertical e argumentos. Para saber mais, acesse os recursos a seguir:
- Para uma introdução à sintaxe de pipe, consulte Trabalhar com a sintaxe de consulta de pipe.
- Para conferir todos os detalhes da sintaxe, consulte a documentação de referência da sintaxe de consulta de pipe.
Neste tutorial, você vai criar uma consulta complexa na sintaxe de pipe usando a tabela bigquery-public-data.austin_bikeshare.bikeshare_trips
disponível publicamente, que contém dados sobre viagens de bicicleta.
Objetivos
- Para ver os dados da tabela, inicie uma consulta com uma cláusula
FROM
. - Adicione colunas usando o operador de pipe
EXTEND
. - Agregue dados por dia e semana usando o operador de pipe
AGGREGATE
. - Agregue dados em uma janela deslizante usando o operador de pipe
CROSS JOIN
. - Filtre os dados usando o operador de pipe
WHERE
. - Compare a estrutura de consulta linear da sintaxe de pipe com a estrutura de consulta aninhada da sintaxe padrão ao realizar agregações de vários níveis.
Antes de começar
Para começar a usar um conjunto de dados públicos do BigQuery, você precisa criar ou selecionar um projeto. O primeiro terabyte de dados processados por mês é gratuito. Assim, você pode começar a consultar conjuntos de dados públicos sem ativar o faturamento. Se quiser ir além do Nível gratuito, também é necessário ativar o faturamento.
-
In the Trusted Cloud console, on the project selector page, select or create a Trusted Cloud project.
-
Verify that billing is enabled for your Trusted Cloud project.
- O BigQuery é ativado automaticamente em novos projetos.
Para ativar o BigQuery em um projeto preexistente,
Enable the BigQuery API.
- Use o operador de pipe
AGGREGATE
com a funçãoCOUNT
para encontrar o número total de viagens feitas e bicicletas usadas. Use a cláusula
GROUP BY
para agrupar os resultados por data.Para copiar seus dados para frente, use a função
GENERATE_ARRAY
e uma junção cruzada:Sintaxe de pipe
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` |> EXTEND CAST(start_time AS DATE) AS date |> CROSS JOIN UNNEST(GENERATE_ARRAY(0, 6)) AS diff_days;
Sintaxe padrão
SELECT *, CAST(start_time AS DATE) AS date FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` CROSS JOIN UNNEST(GENERATE_ARRAY(0, 6)) AS diff_days;
A função
GENERATE_ARRAY
cria uma matriz com sete elementos, de0
a6
. A operaçãoCROSS JOIN UNNEST
cria sete cópias de cada linha, com uma nova colunadiff_days
que contém um dos valores de elemento da matriz de0
a6
para cada linha. É possível usar os valoresdiff_days
como o ajuste da data original para avançar a janela em até sete dias após a data original.Para conferir as datas ativas calculadas das viagens, use o operador de pipe
EXTEND
com a funçãoDATE_ADD
para criar uma coluna chamadaactive_date
que contém a data de início mais o valor na colunadiff_days
:Sintaxe de pipe
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` |> EXTEND CAST(start_time AS DATE) AS date |> CROSS JOIN UNNEST(GENERATE_ARRAY(0, 6)) AS diff_days |> EXTEND DATE_ADD(date, INTERVAL diff_days DAY) AS active_date;
Sintaxe padrão
SELECT *, DATE_ADD(date, INTERVAL diff_days DAY) AS active_date FROM ( SELECT *, CAST(start_time AS DATE) AS date FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` CROSS JOIN UNNEST(GENERATE_ARRAY(0, 6)) AS diff_days)
Por exemplo, uma viagem que começa em
2024-05-20
também é considerada ativa em cada dia até2024-05-26
.Por fim, agregue os IDs de viagens e de bicicletas e agrupe por
active_date
:Sintaxe de pipe
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` |> EXTEND CAST(start_time AS DATE) AS date |> CROSS JOIN UNNEST(GENERATE_ARRAY(0, 6)) AS diff_days |> EXTEND DATE_ADD(date, INTERVAL diff_days DAY) AS active_date |> AGGREGATE COUNT(DISTINCT bike_id) AS active_7d_bikes, COUNT(trip_id) AS active_7d_trips GROUP BY active_date DESC;
Sintaxe padrão
SELECT DATE_ADD(date, INTERVAL diff_days DAY) AS active_date, COUNT(DISTINCT bike_id) AS active_7d_bikes, COUNT(trip_id) AS active_7d_trips FROM ( SELECT *, CAST(start_time AS DATE) AS date FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` CROSS JOIN UNNEST(GENERATE_ARRAY(0, 6)) AS diff_days) GROUP BY active_date ORDER BY active_date DESC;
O resultado será semelhante ao seguinte:
+-------------+-----------------+-----------------+ | active_date | active_7d_bikes | active_7d_trips | +-------------+-----------------+-----------------+ | 2024-07-06 | 90 | 331 | | 2024-07-05 | 142 | 726 | | 2024-07-04 | 186 | 1163 | | ... | ... | ... | +-------------+-----------------+-----------------+
- Adicione outro operador de pipe
EXTEND
que usa uma função de janela com uma cláusulaOVER
para calcular a data máxima na tabela. - Use o operador de pipe
WHERE
para filtrar as linhas geradas que estão após a data máxima. - Para mais informações sobre como a sintaxe de pipe funciona, consulte Trabalhar com a sintaxe de consulta de pipe.
- Para mais informações técnicas, consulte a documentação de referência sobre a sintaxe de consulta de pipe.
Para mais informações sobre as diferentes maneiras de executar consultas, consulte Executar uma consulta.
Ver dados da tabela
Para recuperar todos os dados da tabela bikeshare_trips
, execute a seguinte consulta:
Sintaxe de pipe
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`;
Sintaxe padrão
SELECT *
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`;
Na sintaxe de pipe, a consulta pode começar com uma cláusula FROM
sem uma cláusula SELECT
para retornar resultados da tabela.
O resultado será semelhante ao seguinte:
+----------+-----------------+---------+-----------+-------------------------+-----+ | trip_id | subscriber_type | bike_id | bike_type | start_time | ... | +----------+-----------------+---------+-----------+-------------------------+-----+ | 28875008 | Pay-as-you-ride | 18181 | electric | 2023-02-12 12:46:32 UTC | ... | | 28735401 | Explorer | 214 | classic | 2023-01-13 12:01:45 UTC | ... | | 29381980 | Local365 | 21803 | electric | 2023-04-20 08:43:46 UTC | ... | | ... | ... | ... | ... | ... | ... | +----------+-----------------+---------+-----------+-------------------------+-----+
Adicionar colunas
Na tabela bikeshare_trips
, a coluna start_time
é um carimbo de data/hora, mas talvez você queira adicionar uma coluna que mostre apenas a data da viagem. Para adicionar uma coluna
na sintaxe de pipe, use o
operador de pipe EXTEND
:
Sintaxe de pipe
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
|> EXTEND CAST(start_time AS DATE) AS date;
Sintaxe padrão
SELECT *, CAST(start_time AS DATE) AS date
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`;
O resultado será semelhante ao seguinte:
+----------+-----------------+---------+-----------+-------------------------+------------+-----+ | trip_id | subscriber_type | bike_id | bike_type | start_time | date | ... | +----------+-----------------+---------+-----------+-------------------------+------------+-----+ | 28875008 | Pay-as-you-ride | 18181 | electric | 2023-02-12 12:46:32 UTC | 2023-02-12 | ... | | 28735401 | Explorer | 214 | classic | 2023-01-13 12:01:45 UTC | 2023-01-13 | ... | | 29381980 | Local365 | 21803 | electric | 2023-04-20 08:43:46 UTC | 2023-04-20 | ... | | ... | ... | ... | ... | ... | ... | ... | +----------+-----------------+---------+-----------+-------------------------+------------+-----+
Agregar dados diários
Você pode agrupar por data para encontrar o número total de viagens feitas e as bicicletas usadas por dia.
Sintaxe de pipe
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
|> EXTEND CAST(start_time AS DATE) AS date
|> AGGREGATE
COUNT(*) AS trips,
COUNT(DISTINCT bike_id) AS distinct_bikes
GROUP BY date;
Sintaxe padrão
SELECT
CAST(start_time AS DATE) AS date,
COUNT(*) AS trips,
COUNT(DISTINCT bike_id) AS distinct_bikes
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
GROUP BY date;
O resultado será semelhante ao seguinte:
+------------+-------+----------------+
| date | trips | distinct_bikes |
+------------+-------+----------------+
| 2023-04-20 | 841 | 197 |
| 2023-01-27 | 763 | 148 |
| 2023-06-12 | 562 | 202 |
| ... | ... | ... |
+------------+-------+----------------+
Ordenar resultados
Para classificar os resultados em ordem decrescente pela coluna date
, adicione o sufixo DESC
à cláusula GROUP BY
:
Sintaxe de pipe
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
|> EXTEND CAST(start_time AS DATE) AS date
|> AGGREGATE
COUNT(*) AS trips,
COUNT(DISTINCT bike_id) AS distinct_bikes
GROUP BY date DESC;
Sintaxe padrão
SELECT
CAST(start_time AS DATE) AS date,
COUNT(*) AS trips,
COUNT(DISTINCT bike_id) AS distinct_bikes
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
GROUP BY date
ORDER BY date DESC;
O resultado será semelhante ao seguinte:
+------------+-------+----------------+
| date | trips | distinct_bikes |
+------------+-------+----------------+
| 2024-06-30 | 331 | 90 |
| 2024-06-29 | 395 | 123 |
| 2024-06-28 | 437 | 137 |
| ... | ... | ... |
+------------+-------+----------------+
Na sintaxe de pipe, é possível adicionar o sufixo de classificação diretamente à cláusula GROUP BY
sem usar o
operador de pipe ORDER BY
.
Adicionar o sufixo à cláusula GROUP BY
é um dos vários recursos opcionais de
ordenação abreviada com AGGREGATE
que a sintaxe de pipe oferece suporte. Na sintaxe padrão, isso não é possível, e você precisa usar a cláusula ORDER BY
para classificação.
Agregar dados semanais
Agora que você tem dados sobre o número de bicicletas usadas a cada dia, é possível criar uma consulta para encontrar o número de bicicletas distintas usadas em cada período de sete dias.
Para atualizar as linhas da tabela e mostrar semanas em vez de dias, use a
função DATE_TRUNC
na cláusula GROUP BY
e defina a granularidade como WEEK
:
Sintaxe de pipe
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
|> EXTEND CAST(start_time AS DATE) AS date
|> AGGREGATE
COUNT(*) AS trips,
COUNT(DISTINCT bike_id) AS distinct_bikes,
GROUP BY DATE_TRUNC(date, WEEK) AS date DESC;
Sintaxe padrão
SELECT
DATE_TRUNC(CAST(start_time AS DATE), WEEK) AS date,
COUNT(*) AS trips,
COUNT(DISTINCT bike_id) AS distinct_bikes,
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
GROUP BY date
ORDER BY date DESC;
O resultado será semelhante ao seguinte:
+------------+-------+----------------+
| date | trips | distinct_bikes |
+------------+-------+----------------+
| 2024-06-30 | 331 | 90 |
| 2024-06-23 | 3206 | 213 |
| 2024-06-16 | 3441 | 212 |
| ... | ... | ... |
+------------+-------+----------------+
Agrega em uma janela deslizante
Os resultados na seção anterior mostram viagens em uma janela fixa entre datas de início e término, como 2024-06-23
a 2024-06-29
. Em vez disso, talvez você queira ver viagens em uma janela deslizante, em um período de sete dias que avança no tempo a cada novo dia. Em outras palavras, para uma determinada data, talvez você queira saber o número de viagens feitas e bicicletas usadas na semana seguinte.
Para aplicar uma janela deslizante aos seus dados, primeiro copie cada viagem para frente seis dias ativos adicionais a partir da data de início. Em seguida, calcule as datas dos dias ativos usando a função DATE_ADD
. Por fim, agregue as viagens e os IDs das bicicletas para cada dia ativo.
Filtrar datas futuras
Na consulta anterior, as datas se estendem até seis dias após a última data nos seus dados. Para filtrar datas que vão além do fim dos seus dados, defina uma data máxima na consulta:
Sintaxe de pipe
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
|> EXTEND CAST(start_time AS DATE) AS date
|> EXTEND MAX(date) OVER () AS max_date
|> CROSS JOIN UNNEST(GENERATE_ARRAY(0, 6)) AS diff_days
|> EXTEND DATE_ADD(date, INTERVAL diff_days DAY) AS active_date
|> WHERE active_date <= max_date
|> AGGREGATE COUNT(DISTINCT bike_id) AS active_7d_bikes,
COUNT(trip_id) AS active_7d_trips
GROUP BY active_date DESC;
Sintaxe padrão
SELECT
DATE_ADD(date, INTERVAL diff_days DAY) AS active_date,
COUNT(DISTINCT bike_id) AS active_7d_bikes,
COUNT(trip_id) AS active_7d_trips
FROM(
SELECT *
FROM (
SELECT *,
DATE_ADD(date, INTERVAL diff_days DAY) AS active_date,
MAX(date) OVER () AS max_date
FROM(
SELECT *, CAST(start_time AS DATE) AS date,
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
CROSS JOIN UNNEST(GENERATE_ARRAY(0, 6)) AS diff_days))
WHERE active_date <= max_date)
GROUP BY active_date
ORDER BY active_date DESC;
O resultado será semelhante ao seguinte:
+-------------+-----------------+-----------------+
| active_date | active_7d_bikes | active_7d_trips |
+-------------+-----------------+-----------------+
| 2024-06-30 | 212 | 3031 |
| 2024-06-29 | 213 | 3206 |
| 2024-06-28 | 219 | 3476 |
| ... | ... | ... |
+-------------+-----------------+-----------------+