Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Como usar apenas o regitro mais atualizado em uma tabela onde o registro se repete diversas vezes?

Bom dia!

Estou trabalhando em uma base onde o mesmo registro se repete diversas vezes, com novas atualizações, mas estou precisando usar apenas o registro mais atualizado. Como é possível ignorar todos os demais e considerar apenas o mais atualizado?

Tenho uma base da seguinte maneira no bigquery:

CÓD POSTAGEM	SITUAÇÃO	DIA ATUALIZAÇÃO	HR ATUALIZAÇÃO
ENVIO 1	SOLICITADO	01/01/2024	07:10
ENVIO 1	ENVIADO PARA SEPARAÇÃO	02/01/2024	08:20
ENVIO 1	SEPARADO	02/01/2024	09:40
ENVIO 1	EM TRANSPORTE	03/01/2024	11:00
ENVIO 1	RECEPCIONADO NA FILIAL	05/01/2024	12:00
ENVIO 1	A CAMINHO DO CLIENTE	06/01/2024	07:23
ENVIO 1	INSUCESSO NA 1ª TENTATIVA	06/01/2024	09:34
ENVIO 1	A CAMINHO DO CLIENTE	07/01/2024	09:40
ENVIO 1	ENTREGUE	07/01/2024	13:00
3 respostas

Oi Marcelo, como vai?

Acredito que uma boa estratégia seria usar a função ROW_NUMBER() junto com uma CTE (Common Table Expression) para selecionar apenas o registro mais atualizado para cada código de postagem.

Seria algo mais ou menos assim:

WITH ranked_updates AS (
  SELECT 
    *,
    ROW_NUMBER() OVER (PARTITION BY `CÓD POSTAGEM` ORDER BY `DIA ATUALIZAÇÃO` DESC, `HR ATUALIZAÇÃO` DESC) AS rn
  FROM 
    sua_tabela
)
SELECT 
  `CÓD POSTAGEM`,
  `SITUAÇÃO`,
  `DIA ATUALIZAÇÃO`,
  `HR ATUALIZAÇÃO`
FROM 
  ranked_updates
WHERE 
  rn = 1;

Aqui está o que cada parte do código faz:

O CTE cria uma tabela temporária onde cada linha é numerada (ROW_NUMBER()) dentro de cada grupo de CÓD POSTAGEM, ordenando pela data e hora de atualização em ordem decrescente. Assim, o registro mais recente para cada CÓD POSTAGEM receberá o número 1. O SELECT final seleciona apenas os registros onde rn = 1, ou seja, o registro mais atualizado para cada CÓD POSTAGEM.

Faça os ajustes necessários para adaptar o código ao seu projeto.

Espero ter ajudado.

Caso este post tenha lhe ajudado, por favor, marque como solucionado ✓. Bons Estudos!

Oi Larissa, tudo bem?

Não deu certo, mas eu expliquei errado. A minha base está no big query, mas a plataforma que estou tentando realizar esse ajuste é no looker, portanto não é o SQL, mas sim o LookML.

solução!

Oi Marcelo!

Entendi, você está usando LookML no Looker para trabalhar com a sua base de dados no BigQuery.

Considerando que você já tem a view da sua tabela no Looker, você pode utilizar uma derivação de conjunto de dados para selecionar apenas os registros mais recentes. Seria algo mais ou menos assim:

view: registros_mais_atualizados {
  derived_table: {
    sql: 
    WITH ranked_updates AS (
      SELECT 
        cod_postagem,
        situacao,
        dia_atualizacao,
        hr_atualizacao,
        ROW_NUMBER() OVER (PARTITION BY cod_postagem ORDER BY dia_atualizacao DESC, hr_atualizacao DESC) AS rn
      FROM 
        ${sua_tabela.SQL_TABLE_NAME}
    )
    SELECT
      cod_postagem,
      situacao,
      dia_atualizacao,
      hr_atualizacao
    FROM
      ranked_updates
    WHERE
      rn = 1
    ;;
  }

  dimension: cod_postagem {
    sql: ${TABLE}.cod_postagem ;;
    type: string
  }

  dimension: situacao {
    sql: ${TABLE}.situacao ;;
    type: string
  }

  dimension: dia_atualizacao {
    sql: ${TABLE}.dia_atualizacao ;;
    type: date
  }

  dimension: hr_atualizacao {
    sql: ${TABLE}.hr_atualizacao ;;
    type: string
  }
}

Então, atualize o seu arquivo de modelo para incluir a nova visão derivada.

model: seu_modelo {
  connection: "sua_conexao"

  explore: registros_mais_atualizados {
    view_label: "Registros Mais Atualizados"
  }
}

Certifique-se de fazer os ajustes necessários para que faça sentido no contexto do seu projeto.

Abraços :)