Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
marcelviegas
Contributor 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

Tags (1)
1 Solution

Accepted Solutions
Employee
Employee

Re: buscar valor mais proximo

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;

7 Replies
rogerioalmeida
Contributor

Re: buscar valor mais proximo

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
Contributor II

Re: buscar valor mais proximo

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

Obrigado!

marcelviegas
Contributor II

Re: buscar valor mais proximo

Grande mestre cleveranjos‌, tens uma dica?

Employee
Employee

Re: buscar valor mais proximo

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;

Employee
Employee

Re: buscar valor mais proximo

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

Re: buscar valor mais proximo

Oi Clever,

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

ABração!

marcelviegas
Contributor II

Re: buscar valor mais proximo

Funcionou Clever,

Muito obrigado tenha um bom dia!!