Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
marcelviegas
Creator II
Creator II

buscar valor mais proximo

Prezados,

preciso de uma dica para fazer a seguinte logica, eu tenho uma tabela cujo o campo Curva esta nulo, a regra é simples, devo busca o valor (curva )do mes anterior mais próximo que possua curva, segue abaixo uma tabela original e como deve ficar

material (Original):

LOAD * INLINE [

codigoMaterial,mesAno,Curva

1, jan 2017 , c

1, fev 2017, -

1, mar 2017, -

1, abr 2017, -

1, mai 2017, b

2, jan 2017 , -

2, fev 2017 , c

2, mar 2017 , -

2 , abr 2017, b

2, mai 2017 , -

];

LOAD * INLINE [

codigoMaterial,mesAno,Curva

1, jan 2017 , c

1, fev 2017, c

1, mar 2017, c

1, abr 2017, c

1, mai 2017, b

2, jan 2017 , -(este item não possui curva anterior logo o mesmo deve continuar nulo)

2, fev 2017 , c

2, mar 2017 , c

2 , abr 2017, b

2, mai 2017 , b

];

Obrigado povo

1 Solution

Accepted Solutions
Clever_Anjos
Employee
Employee

o seu campo é nulo ou = '-'?

t:

LOAD codigoMaterial,date#(mesAno,'MMM YYYY') as mesAno,Curva INLINE [

codigoMaterial,mesAno,Curva

1, jan 2017 , c

1, fev 2017, -

1, mar 2017, -

1, abr 2017, -

1, mai 2017, b

2, jan 2017 , -

2, fev 2017 , c

2, mar 2017 , -

2 , abr 2017, b

2, mai 2017 , -

];

t2:

noconcatenate load

codigoMaterial,

mesAno,

If(Curva<>'-',Curva,If(codigoMaterial=Peek(codigoMaterial),Peek(Curva))) as Curva

Resident t

order by codigoMaterial,mesAno;

drop Table t;

View solution in original post

7 Replies
rogerioalmeida
Creator
Creator

Marcel,

Eu fiz algo parecido com o que esta pensando utilizando o Previous, claro que isso não é definitivo, você pode pensar em fazer um FOR com isso também, um amigo do trabalho já fez utilizando FOR, acredito que para o seu caso possa servir o Previous ou ainda o Peek, segue um exemplo.

Curva_base:

LOAD * INLINE [

codigoMaterial,mesAno,Curva

1, jan 2017 , c

1, fev 2017, -

1, mar 2017, -

1, abr 2017, -

1, mai 2017, b

2, jan 2017 , -

2, fev 2017 , c

2, mar 2017 , -

2 , abr 2017, b

2, mai 2017 , -

];

noconcatenate

Curva_ordenada:

Load * resident Curva_base

order_by mesAno;

;

drop table Curva_base;

Curva_Final:

Load *

if(isnull(Curva), previous(Curva),Curva) as Curvas


resident Curva_ordenada;

drop table Curva_ordenada;

O ruim do Previous é porque tem que estar mais ou menos como você passou e estar ordenado, por isso coloquei um order by no meio ali, então pode ser que o FOR com Peek funcione melhor.

Tem algumas dúvida parecidas com a sua ai.

Comparando Valores Anteriores

https://help.qlik.com/pt-BR/sense/3.1/Subsystems/Hub/Content/Scripting/InterRecordFunctions/Peek.htm

https://www.google.com.br/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjeh_Oa7rbWAhVFvZAKHRWT...

Espero ter ajudado    

marcelviegas
Creator II
Creator II
Author

Vou ler o material que enviaste, mas o exemplo não funcionou.

Obrigado!

marcelviegas
Creator II
Creator II
Author

Grande mestre cleveranjos‌, tens uma dica?

Clever_Anjos
Employee
Employee

o seu campo é nulo ou = '-'?

t:

LOAD codigoMaterial,date#(mesAno,'MMM YYYY') as mesAno,Curva INLINE [

codigoMaterial,mesAno,Curva

1, jan 2017 , c

1, fev 2017, -

1, mar 2017, -

1, abr 2017, -

1, mai 2017, b

2, jan 2017 , -

2, fev 2017 , c

2, mar 2017 , -

2 , abr 2017, b

2, mai 2017 , -

];

t2:

noconcatenate load

codigoMaterial,

mesAno,

If(Curva<>'-',Curva,If(codigoMaterial=Peek(codigoMaterial),Peek(Curva))) as Curva

Resident t

order by codigoMaterial,mesAno;

drop Table t;

Clever_Anjos
Employee
Employee

codigoMaterial mesAno Curva
1jan 2017c
1fev 2017c
1mar 2017c
1abr 2017c
1mai 2017b
2jan 2017 
2fev 2017c
2mar 2017c
2abr 2017b
2mai 2017b
marcelviegas
Creator II
Creator II
Author

Oi Clever,

O campo é nulo, vou implementar tua ideia já lanço aqui o resultado, obrigado mestre!

ABração!

marcelviegas
Creator II
Creator II
Author

Funcionou Clever,

Muito obrigado tenha um bom dia!!