none
Selecionando registro considerando a maior data RRS feed

  • 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

    quarta-feira, 9 de maio de 2012 18:47

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
    quarta-feira, 9 de maio de 2012 19:12

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
    quarta-feira, 9 de maio de 2012 19:12
  • 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

    Cara, 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

    quarta-feira, 9 de maio de 2012 19:22