Usuário com melhor resposta
Selecionando registro considerando a maior data

Pergunta
-
Pessoal;
Tenho a seguinte tabela.
Essa tabela é carregada com informações vindas de outro banco. Estou fazendo uma procedure para realizar a carga dela, só que o banco de origem me retorna dados duplicados que possuem registros com o Código do Funcionário e Código da Caixa iguais, porém, com datas diferentes.
Para resolver esse problema, eu tenho duas opções:
1º Alterar a estrutura da minha tabela para aceitar esses registros duplicados;
2º Inserir apenas o registros mais relevante sem alterar a minha tabela.
A primeira opção para mim é inviável, pois eu teria que atualizar o modelo de dados da minha aplicação, e realizar testes em várias telas que utilizam esse registros, sem contar que o sistema já está quase sendo colocado em produção.
Sendo assim, pulei para a segunda opção, mas estou tendo dificuldades para retornar os registros mais relevantes (considerando o registro que tem a data início validade mais recente).
Esse é o select que busca os registros que eu preciso inserir nessa tabela:
DECLARE @lastRun DATETIME /*ULTIMA DATA DE ATUALIZACAO*/ SELECT @lastRun = ISNULL((SELECT MAX(ACHI_DT_ATUALIZACAO) FROM ACESSO_HIERARQUIA) , '19000101') SELECT A.*, C.NICA_CD_NIVEL_CAIXA AS CodigoNivel INTO #AcessoHierarquia FROM HCMAcessoHierarquia A INNER JOIN CAIXA C on C.CAIX_CD_CAIXA = A.CodigoCaixa WHERE CONVERT(DATETIME, @lastRun, 103) < CONVERT(DATETIME, CONVERT(datetime, A.DataAtualizacao,103) + ' ' + convert(varchar(10), dateadd(second, A.HoraAtualizacao, 0), 108), 103)
Esse registro retorna, por exemplo, esses registros:
Neste caso, eu preciso que seja retornado o registro com a data início mais recente, ou seja, o segundo (dos que estão sinalizados).
Alguém tem alguma ideia de como fazer isso?
Deise Vicentin
"Eu não procuro saber as respostas, procuro compreender as perguntas." Confúcio
Respostas
-
Deise,
Acredito que uma CTE resolva seu problema, como no exemplo que vou postar para você ter uma idéia:
DECLARE @lastRun DATETIME /*ULTIMA DATA DE ATUALIZACAO*/ SELECT @lastRun = ISNULL((SELECT MAX(ACHI_DT_ATUALIZACAO) FROM ACESSO_HIERARQUIA) , '19000101') ;WITH Consulta AS ( SELECT A.*, C.NICA_CD_NIVEL_CAIXA AS CodigoNivel, ROW_NUMBER() OVER(PARTITION BY A.NICA_CD_NIVEL_CAIXA ORDER BY A.ACHI_DT_INICIO_VALIDADE DESC) AS Linha INTO #AcessoHierarquia FROM HCMAcessoHierarquia A INNER JOIN CAIXA C on C.CAIX_CD_CAIXA = A.CodigoCaixa WHERE CONVERT(DATETIME, @lastRun, 103) < CONVERT(DATETIME, CONVERT(datetime, A.DataAtualizacao,103) + ' ' + convert(varchar(10), dateadd(second, A.HoraAtualizacao ) SELECT * FROM Consulta WHERE Linha = 1
Eu não testei essa query, mas achop que seguindo essa linha você consegue.[]'s
Philipe Souza
E-mail: Philipe.s.souza@hotmail.com- Marcado como Resposta Deise Vicentin quarta-feira, 9 de maio de 2012 19:22
Todas as Respostas
-
Deise,
Acredito que uma CTE resolva seu problema, como no exemplo que vou postar para você ter uma idéia:
DECLARE @lastRun DATETIME /*ULTIMA DATA DE ATUALIZACAO*/ SELECT @lastRun = ISNULL((SELECT MAX(ACHI_DT_ATUALIZACAO) FROM ACESSO_HIERARQUIA) , '19000101') ;WITH Consulta AS ( SELECT A.*, C.NICA_CD_NIVEL_CAIXA AS CodigoNivel, ROW_NUMBER() OVER(PARTITION BY A.NICA_CD_NIVEL_CAIXA ORDER BY A.ACHI_DT_INICIO_VALIDADE DESC) AS Linha INTO #AcessoHierarquia FROM HCMAcessoHierarquia A INNER JOIN CAIXA C on C.CAIX_CD_CAIXA = A.CodigoCaixa WHERE CONVERT(DATETIME, @lastRun, 103) < CONVERT(DATETIME, CONVERT(datetime, A.DataAtualizacao,103) + ' ' + convert(varchar(10), dateadd(second, A.HoraAtualizacao ) SELECT * FROM Consulta WHERE Linha = 1
Eu não testei essa query, mas achop que seguindo essa linha você consegue.[]'s
Philipe Souza
E-mail: Philipe.s.souza@hotmail.com- Marcado como Resposta Deise Vicentin quarta-feira, 9 de maio de 2012 19:22
-
Deise,
Acredito que uma CTE resolva seu problema, como no exemplo que vou postar para você ter uma idéia:
DECLARE @lastRun DATETIME /*ULTIMA DATA DE ATUALIZACAO*/ SELECT @lastRun = ISNULL((SELECT MAX(ACHI_DT_ATUALIZACAO) FROM ACESSO_HIERARQUIA) , '19000101') ;WITH Consulta AS ( SELECT A.*, C.NICA_CD_NIVEL_CAIXA AS CodigoNivel, ROW_NUMBER() OVER(PARTITION BY A.NICA_CD_NIVEL_CAIXA ORDER BY A.ACHI_DT_INICIO_VALIDADE DESC) AS Linha INTO #AcessoHierarquia FROM HCMAcessoHierarquia A INNER JOIN CAIXA C on C.CAIX_CD_CAIXA = A.CodigoCaixa WHERE CONVERT(DATETIME, @lastRun, 103) < CONVERT(DATETIME, CONVERT(datetime, A.DataAtualizacao,103) + ' ' + convert(varchar(10), dateadd(second, A.HoraAtualizacao ) SELECT * FROM Consulta WHERE Linha = 1
Eu não testei essa query, mas achop que seguindo essa linha você consegue.
[]'s
Philipe Souza
E-mail: Philipe.s.souza@hotmail.comCara, deu certo!
Eu tive que modificar dentro do primeiro select o "SELECT * INTO #AcessoHierarquia" pois deu erro de sintaxe, mas mesmo assim consegui adaptar aqui!
Valeu!
Deise Vicentin
"Eu não procuro saber as respostas, procuro compreender as perguntas." Confúcio