Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
tucahernandes
Contributor II
Contributor II

Somando intervalos de tempos de eventos distintos com períodos coincidentes

Olá, pessoal

Preciso unificar os tempos de uma série de eventos, unindo as faixas de tempo coincidentes. A soma do total deve corresponder a soma do que teríamos em uma timeline.

No exemplo simplificado abaixo, isoladamente, a soma entre os eventos daria 04:10. Mas o que preciso é da dinâmica da timeline, na qual o total resultaria no tempo de 02:10.

tucahernandes_0-1630447670777.png

 

Como chego nesse resultado, expandindo essa lógica para toda e qualquer base similar?

A base simplificada abaixo, para facilitar na investigação:

Eventos:
LOAD * INLINE [
Evento,Início,Fim
1,15/10/2019 02:40,15/10/2019 04:40
2,15/10/2019 02:50,15/10/2019 04:50
3,15/10/2019 05:50,15/10/2019 06:00
]

Obrigado!

Labels (6)
1 Solution

Accepted Solutions
Thiago_Justen_

Nobre @tucahernandes, veja o output que consegui com o script que deixo anexo aqui:

 

Output_Tuca.png

 

Apenas um aviso: confesso que abusei de preceding load e posso até ter viajado bastante pra executar a tarefa dada, mas que o script lhe sirva de inspiração para seu projeto real.

Abraços e Sucesso!!

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago

View solution in original post

8 Replies
Thiago_Justen_

Salve nobre @tucahernandes, como vai?

 

Espero que eu consiga te ajudar de alguma forma. Com teu exemplo criei um campo chamado TimeBase que me foi útil para identificar os intervalos corretamente. Veja:

thiago_justen_0-1630453496772.png

O resultado é esse:

thiago_justen_1-1630453557279.png

Tomara que isso te inspire a criar uma solução que melhor se enquadre nos teus requisitos.

 

Abs e Sucesso!!

 

 

 

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
Thiago_Justen_

@tucahernandes caso você queira rodar esse meu script, segue abaixo. Daí na tela coloca um tabela simples só pra verificar e foi.

Temp:
LOAD
        Evento,
        Timestamp(Timestamp#(Início,'DD/MM/YYYY hh:mm')) as Início,
        Timestamp(Timestamp#(Fim,'DD/MM/YYYY hh:mm')) as Fim,
        Date(Timestamp#(Início,'DD/MM/YYYY hh:mm'))&'-'&Hour(Timestamp#(Início,'DD/MM/YYYY hh:mm')) as 'TimeBase'
;
LOAD * INLINE [
Evento,Início,Fim
1,15/10/2019 02:40,15/10/2019 04:40
2,15/10/2019 02:50,15/10/2019 04:50
3,15/10/2019 05:50,15/10/2019 06:00
];

Eventos:
LOAD
        *,
        If(Ini_Intervalo=Início,time(0,'hh:mm'),
             Interval(Fim-Ini_Intervalo,'hh:mm')
         )                                                                                      as 'Intervalo'
;
LOAD
             *,
             If(Previous(TimeBase) = TimeBase,
                    Previous(Início),
                    Início
              )                                                                                as 'Ini_Intervalo'
Resident Temp
              Order By
                    TimeBase
              Asc
;

Drop Table Temp;

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
tucahernandes
Contributor II
Contributor II
Author

Bom dia, @Thiago_Justen_ 

Obrigado pela sugestão!

A lógica dela serve perfeitamente para o exemplo específico que compartilhei. No entanto, para que haja um agrupamento, a mesma exige que as datas e tempos entre linhas superior e inferior sejam do mesmo dia e horário (no caso aqui, tivemos um grupo de duas linhas com 15/10/2019-2 e uma linha do grupo 15/10/2019-5). Nesse sentido, criando um outro exemplo, percebe-se que é preciso um refinamento nessa lógica. 

Preciso que seja algo mais flexível, atendendo também, por exemplo, situações com a que temos abaixo, onde mudei somente a data e horário de início do Evento 1 (de 15/10/2019 02:40 para 14/10/2010 11:50): 

tucahernandes_0-1630497134168.png

Segue a nova situação:

Eventos:
LOAD * INLINE [
Evento,Início,Fim
1,14/10/2019 11:50,15/10/2019 04:40
2,15/10/2019 02:50,15/10/2019 04:50
3,15/10/2019 05:50,15/10/2019 06:00
]

Aproveitando, segue um outro exemplo, com o Evento 2 dentro do espaço de tempo do Evento 1 (tempo esse do evento 2 que não deve ser contabilizado, seguindo na lógica da timeline):

Eventos:
LOAD * INLINE [
Evento,Início,Fim
1,14/10/2019 11:50,15/10/2019 04:40
2,15/10/2019 02:50,15/10/2019 03:50
3,15/10/2019 05:50,15/10/2019 06:00
]

Obrigado!

 

Thiago_Justen_

@tucahernandes acabei me enganando na construção do script e portanto a solução acima não está correta.

Segue o script alterado com um group by por TimeBase. 

Temp:
LOAD
    Evento,
    Timestamp(Timestamp#(Início,'DD/MM/YYYY hh:mm')) as Início,
    Timestamp(Timestamp#(Fim,'DD/MM/YYYY hh:mm')) as Fim,
    Date(Timestamp#(Início,'DD/MM/YYYY hh:mm'))&'-'&Hour(Timestamp#(Início,'DD/MM/YYYY hh:mm')) as 'TimeBase'
;
LOAD * INLINE [
Evento,Início,Fim
1,15/10/2019 02:40,15/10/2019 04:40
2,15/10/2019 02:50,15/10/2019 04:50
3,15/10/2019 05:50,15/10/2019 06:00
];

Left Join(Temp)
LOAD
    TimeBase,
    Min(Início) as Ini_Intervalo,
    Max(Fim) as Fim_Intervalo
Resident Temp
Group By
TimeBase;

Eventos:
LOAD
*,
If(Previous(TimeBase) = TimeBase,
time(0,'hh:mm'),
Interval(Fim_Intervalo-Ini_Intervalo,'hh:mm')
) as 'Intervalo'
Resident Temp
Order By
TimeBase
Asc
;

Drop Table Temp;

 

Output:

thiago_justen_0-1630497629530.png

Abs e Sucesso!

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
tucahernandes
Contributor II
Contributor II
Author

Olá @Thiago_Justen_ 

Considere aqui também a minha resposta anterior. Rodando o seu exemplo recente, modificando a data do evento 1, temos a seguinte situação: 

tucahernandes_0-1630497862649.png

Aqui, indo na lógica da timeline contínua, o total devia resultar em 17:10.

tucahernandes_1-1630497936139.png

Obrigado novamente!

 

 

 

 

Thiago_Justen_

Nobre @tucahernandes, veja o output que consegui com o script que deixo anexo aqui:

 

Output_Tuca.png

 

Apenas um aviso: confesso que abusei de preceding load e posso até ter viajado bastante pra executar a tarefa dada, mas que o script lhe sirva de inspiração para seu projeto real.

Abraços e Sucesso!!

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
tucahernandes
Contributor II
Contributor II
Author

Olá @Thiago_Justen_ 

Obrigado pela nova sugestão. Agora deu certo!

Testei vários cenários e todos seguiram a dinâmica de contabilização da timeline. Irei adaptar pra minha base real aqui. No mais, não teve viagem sua aqui, mas sim solução. 

Muito obrigado, espero que seja útil para outros aqui da comunidade que tiverem a mesma questão a ser implementada.

Abs e sucesso!

 

 

 

Thiago_Justen_

Perfeito meu amigo! O importante é que ficou resolvido e espero que sirva ao teu cenário real.

Abs e Sucesso!!

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago