Qlik Community

Brasil

cancel
Showing results for 
Search instead for 
Did you mean: 
tucahernandes
Contributor II
Contributor II

Dinâmica para agregação de intervalos de tempo mediante regras

Olá, pessoal

Preciso criar uma dinâmica que estabeleça agregações de intervalos de tempos conforme a dimensão envolvida.
A regra se dá a partir do intervalo de horas entre o tempo mínimo de início e o tempo máximo do fim.

Para exemplificar bem, criei um modelo que ilustra bem o que preciso.

No exemplo abaixo, se estamos visualizando produto é um valor por produto. Se o grupo, outro valor pro grupo. E no final, preciso chegar a um valor que estabeleça a soma dos valores dos grupos.

Agregação por Produto de cada grupoAgregação por Produto de cada grupo

Agregação por grupos, tendo a soma entre eles no fimAgregação por grupos, tendo a soma entre eles no fim

Preciso de um expressão que consiga estabelecer todas essas situações, sendo que, no exemplo que dei, o valor final seja 12:30 (ou 12,5 horas) . Alguém poderia me sinalizar uma solução? Deixei em anexo um arquivo com a mesma base do exemplo.

Obrigado!

Labels (9)
1 Solution

Accepted Solutions
danilostochi
Creator II
Creator II

Boa noite, 

Fiz no objeto gráfico, não é a mesma coisa mas pode servir, caso precise de um objeto de texto com o valor, basta fazer uma agregação (Da um pouco mais de trabalho)

Tempo inicio:

Date(min(aggr(Date(
FirstSortedValue(Tempo, Tempo)
),Grupo, Produto, Tempo, Status)),'DD/MM/YYYY HH:mm:ss')

Tempo Fim:

Date(max(aggr(Date(
FirstSortedValue(Tempo, Tempo)
),Grupo, Produto, Tempo, Status)),'DD/MM/YYYY HH:mm:ss')

 

Tempo:

Time(Interval(Column(2)-Column(1)))

//Observação: Marcar a opção "Função Totais"="Sum"

danilostochi_1-1630201203283.png

 

 

qlik.gif

 

 

 

+55(44) 9 9993-3605, WhatsApp
E-Mail or Skype - danilo16stochi@hotmail.com

View solution in original post

4 Replies
danilostochi
Creator II
Creator II

Olá, tudo bem?

Creio que isso possa dar certo:

 

//Via script

dados:
LOAD

if(Status='Início',
Date(FirstSortedValue(Tempo, Tempo),'DD/MM/YYYY HH:mm:ss'),
if(Status='Fim',
Date(FirstSortedValue(Tempo, -Tempo),'DD/MM/YYYY HH:mm:ss')
)

)as PrimeiroTempo,
Grupo,
Produto,
Status

FROM
[C:\Users\danilo.stochi\Downloads\ArquivoExemplo.xlsx]
(ooxml, embedded labels, table is Tempos)
Group by
Grupo,
Produto,
Status;

dados2:
LOAD
*,

Time#(Interval( if(Previous(Grupo)=Grupo and
Previous(Produto)=Produto,
Previous(PrimeiroTempo)
)-PrimeiroTempo)) as Tempo

Resident dados
order by
Grupo,
Produto,
PrimeiroTempo desc;


DROP table dados;

danilostochi_0-1630111465703.png

 

 

 

 

 

 

 

+55(44) 9 9993-3605, WhatsApp
E-Mail or Skype - danilo16stochi@hotmail.com
tucahernandes
Contributor II
Contributor II
Author

Obrigado, Danilo

Antes de tudo, algumas correções sobre os resultados do exemplo que compartilhei:

1 - Na primeira imagem, no intervalo entre os produtos A1, o valor correto é 06:00 (entre 10 e 16hs)

2 - Na segunda imagem, o intervalo do Grupo A deve ser 07:00 (entre 10 e 17hs)

3 - A soma entre os grupos deve dar 15:30 (07:00 + 08:30)

Um detalhe que não mencionei: os valores devem mudar  conforme o filtro que o usuário estiver fazendo, razão pela qual preciso de uma expressão que faça as agregações conforme esses filtros. A opção pelo load script poderia resolver em parte, mas no caso aqui deixa os valores travados.

Por exemplo, podem existir ocasiões de um mesmo produto constar em diferentes grupos. Digamos que temos o produto A1 em 10 grupos distintos. Se o o usuário filtrar por esse produto o resultado deve ser a soma dos intervalos desse produto em cada grupo.  Indo além, se o usuário filtrar por 3 produtos, deve ser feito um cálculo por grupo, através da dinâmica entre o tempo mínimo do início e o máximo do fim. E então, somar esses tempos distintos em cada grupo.

No mais, obrigado novamente pela sua sugestão!

 

 

danilostochi
Creator II
Creator II

Boa noite, 

Fiz no objeto gráfico, não é a mesma coisa mas pode servir, caso precise de um objeto de texto com o valor, basta fazer uma agregação (Da um pouco mais de trabalho)

Tempo inicio:

Date(min(aggr(Date(
FirstSortedValue(Tempo, Tempo)
),Grupo, Produto, Tempo, Status)),'DD/MM/YYYY HH:mm:ss')

Tempo Fim:

Date(max(aggr(Date(
FirstSortedValue(Tempo, Tempo)
),Grupo, Produto, Tempo, Status)),'DD/MM/YYYY HH:mm:ss')

 

Tempo:

Time(Interval(Column(2)-Column(1)))

//Observação: Marcar a opção "Função Totais"="Sum"

danilostochi_1-1630201203283.png

 

 

qlik.gif

 

 

 

+55(44) 9 9993-3605, WhatsApp
E-Mail or Skype - danilo16stochi@hotmail.com
tucahernandes
Contributor II
Contributor II
Author

Excelente, Danilo.

Era essa a ideia mesmo nesse protótipo. Perfeito. Agora irei adaptar a mesma lógica aos dados reais que tenho aqui.

Obrigado pela disponibilidade e, sobretudo, paciência também. Espero que seja útil para outros profissionais aqui também!