3
respostas

[Dúvida] Aula 04 05 - Mão na massa

Como solução do desafio da aula 04 05 (mão na massa) encontrei esta:

SELECT
  id_produto,
  nome,
  categoria,
  preco,
  id_materia,
  (SELECT val FROM UNNEST(materiasprimas) AS val WITH OFFSET pos WHERE pos = ARRAY_LENGTH(materiasprimas)-1) AS ultima_materia,
  (SELECT val FROM UNNEST(distribuicao) AS val WITH OFFSET pos WHERE pos = ARRAY_LENGTH(distribuicao)-1) AS ultima_dist
FROM
  `curso-bigquery-436611.beleza_verde_vendas.produtos`;

Do campo array de materiasprimas, seleciono um valor (varaivel auxiliar val) que resulta do desmonte do array, selecciono com offset na posição onde a posição é igual ao comprimento do array menos 1. Mesma solução para encontrar a última distribuição.

Gostaria saber se outras alternativas.

Obrigado.

3 respostas

Oii, Pablo! Tudo bem?

Ao clicar no botão Ver opinião do Instrutor você pode ver outra alternativa, feita pelo Instrutor. Deixo aqui o código:

SELECT
  id_produto,
  ARRAY_LENGTH(distribuicao) AS tamanho_distribuicao,
  ARRAY_LENGTH(materiasprimas) AS tamanho_materiasprimas,
  distribuicao[OFFSET(ARRAY_LENGTH(distribuicao) - 1)] AS ultimo_elemento_distribuicao,
  materiasprimas[OFFSET(ARRAY_LENGTH(materiasprimas) - 1)] AS ultimo_elemento_materiasprimas
FROM
  curso-big-query-12339.belleza_verde_vendas.produtos;

E para ver a explicação de como ele construiu a consulta, clique aqui.

Continue se dedicando aos estudos e qualquer dúvida, conte conosco por aqui.

Bons estudos!

Pergunta, porque devemos usar offset, se apenas dando o elemento do array podemos obter o valor?

Ao inves disto:

distribuicao[OFFSET(ARRAY_LENGTH(distribuicao) - 1)] AS ultimo_elemento_distribuicao,

Eu testei isto

distribuicao[ARRAY_LENGTH(distribuicao) - 1] AS ultimo_elemento_distribuicao,

e funcionou.

Oii, Pablo! Tudo bem?

Ambas formas estão corretas. A questão de usar o OFFSET é para se ter mais flexibilidade para trabalhar com números inteiros e evitar acessos fora do índice, além de ser por didática, também, para expandir os conhecimentos.

Espero ter ajudado. Caso tenha outras dúvidas durante o curso, abra um novo tópico no fórum, estaremos por aqui para te ajudar.

Até mais!