Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bom Dia !!!
Tenho uma Tabela onde tenho Item e Vigência dele, e existem várias vigências para cada item preciso identificar a última vigência e a anterior a ela.
Exemplo:
Item | Unidade | Vigência Und |
157422 | ML | 01/02/2016 |
157422 | ML | 01/04/2016 |
157422 | UND | 01/06/2016 |
157422 | ML | 01/09/2016 |
pois preciso saber quais itens mudaram a "Unidade" da última vigência pra anterior.
Ou armazenar a última unidade e a anterior para comparação,
o Peek pega o UND e o ML também que é anterior a UND, só preciso da Anterior a Última.
Desde já agradeço.
Cara aqui está o script para a maxima data e anterior.
Da parte da unidade não entendi muito bem do que precisa.
Teste:
LOAD * INLINE [
Item, Unidade, Vigência Und
157422, ML, 01/02/2016
157422, ML, 01/04/2016
157422, UND, 01/06/2016
157422, ML, 01/09/2016
];
NoConcatenate
Tmp:
Load Item, Unidade, Date(Floor([Vigência Und]),'DD/MM/YYYY') As Vigencia
Resident Teste;
Drop table Teste;
PegaMax:
Load
Item,
Max(Vigencia) As Maxima,
Max(Vigencia,2) As MaximaAnt
Resident Tmp Group by Item;
Fábio,
Você pegou as duas datas a última e a anterior nos campos Maxima e MaximaAnt preciso de alguma forma sinalizar essas datas, pois em uma tabela precisarei demonstrar qual mudou a unidade.
Exemplo:
A unidade do produto na Vigência "Maxima" for diferente da Unidade do Produto na Vigencia "MaximaAnt", sinalizo com uma mensagem.
Item | Unidade | Vigência Und | Alt.Uni |
157422 | ML | 01/02/2016 | |
157422 | ML | 01/04/2016 | |
157422 | UND | 01/06/2016 | |
157422 | ML | 01/09/2016 | Sim |
Um Campo Flag sinalizando os casos que tiveram alteração de unidade, da última vigência com relação a anterior.
Vinicius,
creio que podes usar
firstsortedvalue (Item, [Vigência Und]) para menor
firstsortedvalue (Item, [Vigência Und], 2) para anterior
Ele retorna ML nas duas expressões.
Eu só preciso de alguma forma sinalizar a mudança de unidade e demonstrar que na vigência 01/09/2016 teve mudança de Unidade.
Veja se é isso que vc precisa:
Teste_TMP:
LOAD * INLINE [
Item, Unidade, VigenciaUnd
157422, ML, 01/02/2016
157422, ML, 01/04/2016
157421, UND, 01/06/2016
157421, ML, 01/09/2016
157422, UND, 01/06/2016
157422, ML, 01/09/2016
157423, UND, 01/06/2016
157423, ML, 01/09/2016
];
NoConcatenate
Teste:
LOAD
Item,
Unidade,
VigenciaUnd,
if(Item = Peek(Item) AND Unidade = Peek(Unidade,-2),'SIM','NÂO') as NOVO
Resident Teste_TMP;
DROP Table Teste_TMP
Prezado Paulo,
Seu Script está excelente mas gostaria de fazer uma observação, por gentileza me corrija se eu estiver enganado:
Para que a função "Peek" funcione corretamente a tabela tem que ser carregada em ordem cronológica não é mesmo? Tipo: Se algum dia o responsável pela alimentação desses dados esquecer de alimentar, quando ele for colocar as informações em dia, ele deverá ficar atento para adicionar os valores na ordem cronológica em que eles ocorreram. Caso contrário o resultado do Script poderá ficar incorreto. Se pudermos contornar esse problema será melhor.
Vou tentar com o Set Analysis numa tabela. Se eu conseguir posto aqui.
Parabéns Paulo.
Wellington,
Se no script do Paulo ele der um order by pelo item e data de vigencia nao resolve a questão que voce sitou?
Pelos testes que fiz aqui resolve sim Mauro.
Estou aproveitando esse questionamento para tentar descobrir outras alternativas para demandas como essa.