CONSULTA COM PROXIMO VALOR

 Tópico anterior Próximo tópico Novo tópico

CONSULTA COM PROXIMO VALOR

SQL / DATABASE

 Compartilhe  Compartilhe  Compartilhe
#496160 - 29/01/2021 15:33:48

DAMASCENO.CESAR
ADAMANTINA
Cadast. em:Fevereiro/2009


Tenho uma tabela com os campos: ID, Matricula, Entrada, Local, Saida, Destino.
Desses campos, somente o campo Destino não está preenchido e o valor correto seria o do próximo registro do campo Local.
Exceto quando é o último registro da matricula, aí não tem um valor para Destino.
|ID    |Matricula    |Entrada          |Local        |Saida        |Destino
|1    |12                |15/03/2018              |Bauru        |20/04/2018    |NULL
|2    |12                |20/04/2018              |Santos        |30/09/2018    |NULL
|3    |12                |30/09/2018              |Salvador    |01/01/2019    |NULL
|4    |12                |01/01/2019              |Curitiba        |NULL        |NULL

O que gostaria de fazer é montar uma consulta que preencha o campo Destino com o próximo valor do campo Local, retornado como segue:
|ID    |Matricula  |Entrada        |Local        |Saida        |Destino
|1    |12              |15/03/2018    |Bauru        |20/04/2018    |Santos
|2    |12              |20/04/2018    |Santos        |30/09/2018    |Salvador
|3    |12              |30/09/2018    |Salvador        |01/01/2019    |Curitiba
|4    |12              |01/01/2019    |Curitiba        |NULL        |NULL

É possível montar uma consulta SQL para esse resultado?
Uso o SGDB MySQL.


O conhecimento como o dinheiro: quanto mais temos, mais queremos ter (Josh Billings)  


Resposta escolhida #496167 - 29/01/2021 20:52:19

DS2T
BARRA MANSA
Cadast. em:Novembro/2010


Você poderia tentar algo assim: (não testei, mas dá pra pegar a ideia)

Considerando que seus ids estejam sempre em ordem sequencial (não pula nenhum número), o jeito mais fácil seria assim:

update
    tabela1 as t1
   left join tabela1 as t2 on t1.id = (t2.id+1)
set
    destino = t2.local


se fosse SQL Server, seria um pouco diferente a ordem (usaria um from)


Agora, se não tiver em ordem, você pode usar a função ROW_Number para conseguir uma sequência e fazer esse vínculo.
Existe também a opção de fazer uma agregação para sempre pegar o MIN após o número.

Caso seja o caso de nem todos estarem sequenciais, me avise que posso estar ajudando com as dúvidas de seguir alguma das implementações acima.

Não nasci pra programar, mas preciso me alimentar...


#496172 - 01/02/2021 16:01:29

DAMASCENO.CESAR
ADAMANTINA
Cadast. em:Fevereiro/2009


Desculpe a demora em responder.
DS2T, fui muito vago na informação, falei que queria preencher deu a entender que gostaria de atualizar o campo, mas na realidade queria apenas exibir o dado na no campo Destino.
Mas usando seu exemplo, consegui montar a pesquisa com o resultado esperado, pena que existam alguns saltos no ID sequencial, vou ter que dar um jeito nisso.
vou fazer uma cópia antes da tabela, é claro, depois vou excluir o campo ID e recriá-lo, para corrigir essas falhas na sequência dos identificadores, ou ver uma forma melhor de realizar a pesquisa sem utilizar o ID.
mas obrigado mesmo, resolveu meu problema totalmente

O conhecimento como o dinheiro: quanto mais temos, mais queremos ter (Josh Billings)  


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por DAMASCENO.CESAR em 01/02/2021 16:01:40