Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Boa tarde
Senhores, tenho um histórico de alterações de preços de produtos.
Porém as alterações ocorrem em datas aleatórias, e com isto tenho datas onde não tenho o preço do produto.
Vejam que:
A primeira data de alteração é 05/02/2019 para 1,99
A segunda data é 08/02/2019 para 2,09
Portanto nos dias 06/02 e 07/02 deve preencher com o preço de 1,99.
E somente no dia 08/02 entraria o 2,09, que ficaria valido nos dias 09/02, 10/02 e 11/02.
Em algumas buscas no fórum eu consegui um código para completar essas datas
Considerando que já carreguei uma tabela Base com o histórico de alterações:
Tmp: noconcatenate LOAD DATA, if(EMPRESA = peek('EMPRESA'),DATA - Peek('DATA'),0) as Q, EMPRESA, COD_PRODUTO, PRECO Resident Base order by EMPRESA, DATA ; Tmp2: noconcatenate LOAD Date(DATA + IterNo() - Q) as DATA, EMPRESA, COD_PRODUTO, alt(PRECO,Peek('PRECO')) as PRECO Resident Tmp While IterNo() <= Q order by EMPRESA, DATA ; drop table Base; drop Table Tmp;
O resultado foi quase o esperado, único problema é que ao invés de trazer o valor da data anterior para a data faltante, o Qlik preencheu com a data posterior, veja:
Nos dias 06/02 e 07/09 preencheu com 2,09 que é o preço do dia 08/02.
Mas o que eu queria era preencher com o preço do dia 05/02 (1,99)
Inclusive por algum motivo nem trouxe o dia 05/02 após a carga.
Conseguem me ajudar?
Célio,
segue
Tmp:
load * Inline [
COD_PRODUTO, EMPRESA, DATA, PRECO
18325, 2, 06/02/2019, '1,99'
18325, 2, 09/02/2019, '2,09'
18325, 2, 13/02/2019, '2,19'
18325, 2, 16/02/2019, '2,19'
18325, 2, 20/02/2019, '2,15'
18325, 2, 21/02/2019, '2,25'
18325, 2, 23/02/2019, '2,19'
18325, 2, 27/02/2019, '2,15'
18325, 2, 27/02/2019, '2,38'
18325, 2, 28/02/2019, '2,15'
18325, 2, 06/03/2019, '2,15'
18325, 2, 08/03/2019, '2,45'
18325, 2, 09/03/2019, '2,18'
18325, 2, 13/03/2019, '2,15'
18325, 2, 15/03/2019, '2,39'
18325, 2, 16/03/2019, '2,18'
18325, 2, 20/03/2019, '2,15'
18325, 2, 27/03/2019, '2,15'
18325, 2, 30/03/2019, '2,19'
18325, 2, 02/04/2019, '2,45'
18325, 2, 03/04/2019, '2,15'
18325, 2, 04/04/2019, '2,19'
];
Tmp_1:
LOAD
EMPRESA,
COD_PRODUTO,
DATA,
if(EMPRESA = Previous(EMPRESA) and COD_PRODUTO = Previous(COD_PRODUTO),date(Previous(DATA)-1),DATA) as DATA_ANTERIOR,
PRECO
Resident Tmp Order by EMPRESA,COD_PRODUTO,DATA DESC , PRECO DESC;
//
Drop Table Tmp;
Final:
LOAD
EMPRESA,
COD_PRODUTO,
date(DATA + (iterno()-1)) as DATA,
PRECO
Resident Tmp_1 While date(DATA + (iterno()-1)) <= DATA_ANTERIOR;
Drop Table Tmp_1;
Opa blz?
Para complementar você pode criar um esquema com Intervalmatch, Peek e Previous.
Posso lhe ajudar a construir o código, mas me manda essa base (pode ser essa tabela exemplo), só para eu não criar uma na mão
Opa show parceiro.
Assim como load inline já te ajuda?
load * Inline [ COD_PRODUTO, EMPRESA, DATA, PRECO 18325, 2, 06/02/2019, '1,99' 18325, 2, 09/02/2019, '2,09' 18325, 2, 13/02/2019, '2,19' 18325, 2, 16/02/2019, '2,19' 18325, 2, 20/02/2019, '2,15' 18325, 2, 21/02/2019, '2,25' 18325, 2, 23/02/2019, '2,19' 18325, 2, 27/02/2019, '2,15' 18325, 2, 27/02/2019, '2,38' 18325, 2, 28/02/2019, '2,15' 18325, 2, 06/03/2019, '2,15' 18325, 2, 08/03/2019, '2,45' 18325, 2, 09/03/2019, '2,18' 18325, 2, 13/03/2019, '2,15' 18325, 2, 15/03/2019, '2,39' 18325, 2, 16/03/2019, '2,18' 18325, 2, 20/03/2019, '2,15' 18325, 2, 27/03/2019, '2,15' 18325, 2, 30/03/2019, '2,19' 18325, 2, 02/04/2019, '2,45' 18325, 2, 03/04/2019, '2,15' 18325, 2, 04/04/2019, '2,19' ]
E acabei percebendo outro detalhe agora enquanto montava o Load.
Vou ter alguns casos que possuem duas alterações no mesmo dia. Exemplo do dia 27/02 teve uma alteração de 2,15 e depois teve outra para 2,38.
Neste caso tem alguma forma de manter apenas o ultimo registro para aquela data?
Neste caso dia 27/02 ficaria apenas com o preço de 2,38
Célio,
segue
Tmp:
load * Inline [
COD_PRODUTO, EMPRESA, DATA, PRECO
18325, 2, 06/02/2019, '1,99'
18325, 2, 09/02/2019, '2,09'
18325, 2, 13/02/2019, '2,19'
18325, 2, 16/02/2019, '2,19'
18325, 2, 20/02/2019, '2,15'
18325, 2, 21/02/2019, '2,25'
18325, 2, 23/02/2019, '2,19'
18325, 2, 27/02/2019, '2,15'
18325, 2, 27/02/2019, '2,38'
18325, 2, 28/02/2019, '2,15'
18325, 2, 06/03/2019, '2,15'
18325, 2, 08/03/2019, '2,45'
18325, 2, 09/03/2019, '2,18'
18325, 2, 13/03/2019, '2,15'
18325, 2, 15/03/2019, '2,39'
18325, 2, 16/03/2019, '2,18'
18325, 2, 20/03/2019, '2,15'
18325, 2, 27/03/2019, '2,15'
18325, 2, 30/03/2019, '2,19'
18325, 2, 02/04/2019, '2,45'
18325, 2, 03/04/2019, '2,15'
18325, 2, 04/04/2019, '2,19'
];
Tmp_1:
LOAD
EMPRESA,
COD_PRODUTO,
DATA,
if(EMPRESA = Previous(EMPRESA) and COD_PRODUTO = Previous(COD_PRODUTO),date(Previous(DATA)-1),DATA) as DATA_ANTERIOR,
PRECO
Resident Tmp Order by EMPRESA,COD_PRODUTO,DATA DESC , PRECO DESC;
//
Drop Table Tmp;
Final:
LOAD
EMPRESA,
COD_PRODUTO,
date(DATA + (iterno()-1)) as DATA,
PRECO
Resident Tmp_1 While date(DATA + (iterno()-1)) <= DATA_ANTERIOR;
Drop Table Tmp_1;
Boa tarde
Amigo, deu quase certo!
Na verdade deu certo hehe porém o Qlik esta preenchendo as datas faltantes até a ultima data que possui registro.
No exemplo utilizado, a ultima data é dia 04/04/2019 então o Qlik esta preenchendo apenas até esta data.
E no caso se eu quiser olhar o preço do produto no dia 09/04 não tem.
É possível aplicar uma condição para ele preencher as datas após o ultimo registro até a data atual?
Perfeita explicação. Obrigado por compartilhar passei pela mesma situação e foi totalmente efetiva a solução dada.