Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

206
Visualizações
Consulta de PostgreSQL para determinar cohortes de datos por marca de tiempo y nombre

Tengo datos que tienen una marca de tiempo y un nombre como:

t nombre
2021-10-01 00:00:00 Lugar A (123)
2021-10-01 00:01:00 Lugar A (123)
2021-10-01 00:06:00 Lugar A (123)
2021-10-01 00:10:00 Lugar B (234)
2021-10-01 00:13:00 Lugar B (234)
2021-10-01 00:15:00 Lugar C (345)
2021-10-01 00:18:00 Lugar C (345)
2021-10-01 00:23:00 Lugar C (345)
2021-10-01 00:27:00 Lugar C (345)
2021-10-01 00:28:00 Lugar C (345)
2021-10-01 00:29:00 Lugar C (345)
2021-10-01 00:30:00 Lugar A (123)
2021-10-01 00:33:00 Lugar A (123)

Quiero construir una consulta que permita encontrar "cohortes" de sesiones de ciclo de proceso donde:

  • alguien está pasando por los pasos de un ciclo y repetirá el mismo proceso o comenzará un nuevo proceso
  • data_timestamp se ordena ASC
  • el nombre es el paso en el que se encuentran actualmente
  • diferentes ciclos tendrán el mismo nombre, que puede repetirse varias veces a lo largo del tiempo, pero puede que no estén en el mismo orden
  • devuelve las siguientes columnas:
    • MIN(data_timestamp) para un nombre antes de un nombre diferente
    • MAX(data_timestamp) para un nombre antes de un nombre diferente
    • nombre

El resultado final debería ser algo como:

min_data_timestamp max_data_timestamp nombre
2021-10-01 00:00:00 2021-10-01 00:06:00 Lugar A (123)
2021-10-01 00:10:00 2021-10-01 00:13:00 Lugar B (123)
2021-10-01 00:15:00 2021-10-01 00:29:00 Lugar C (123)
2021-10-01 00:30:00 2021-10-01 00:33:00 Lugar A (123)

Estoy asumiendo algún tipo de consulta de ventana/CTE para hacer esto. He visto otros ejemplos que encuentran la hora de inicio/finalización general para un nombre o algo similar, pero no donde el nombre se repite en todo momento.

EDITAR tenía algunos errores tipográficos

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Puede usar row_number con group by :

 with pr as ( select row_number() over (order by id) r, id, name from processes ), pr1 as ( select p.*, (select sum(case when p1.r < pr and p1.name != p.name then 1 end) from pr p1) gid from pr p ) select min(p.id), max(p.id), max(p.name) from pr1 p group by p.gid order by case when p.gid is null then 1 else p.gid end;

Producción:

min_data_timestamp max_data_timestamp nombre
2021-10-01 00:00:00 2021-10-01 00:06:00 Lugar A (123)
2021-10-01 00:10:00 2021-10-01 00:13:00 Lugar B (234)
2021-10-01 00:15:00 2021-10-01 00:29:00 Lugar C (345)
2021-10-01 00:30:00 2021-10-01 00:33:00 Lugar A (123)
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda