Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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.
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!
Nobre @tucahernandes, veja o output que consegui com o script que deixo anexo aqui:
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!!
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:
O resultado é esse:
Tomara que isso te inspire a criar uma solução que melhor se enquadre nos teus requisitos.
Abs e Sucesso!!
@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;
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):
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!
@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:
Abs e Sucesso!
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:
Aqui, indo na lógica da timeline contínua, o total devia resultar em 17:10.
Obrigado novamente!
Nobre @tucahernandes, veja o output que consegui com o script que deixo anexo aqui:
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!!
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!
Perfeito meu amigo! O importante é que ficou resolvido e espero que sirva ao teu cenário real.
Abs e Sucesso!!