none
Recuperar o penultimo registro RRS feed

  • Pergunta

  • ola,

    Preciso obter o Ultimo Registro e Também o PENULTIMO REGISTRO
    Tenho este script abaixo


    DECLARE @Temp TABLE(
    idVeiculoHistorico INT,
    idVeiculo INT,
    UltimoIdVeiculoHistorico INT,
    PenultimoIdVeiculoHistorico INT,
    idCidadePais INT,
    Placa Varchar(07)
    )

    INSERT INTO @Temp (idVeiculoHistorico, idVeiculo, UltimoIdVeiculoHistorico,PenultimoIdVeiculoHistorico, idCidadePais, Placa)
    SELECT vh.idVeiculoHistorico, vh.idVeiculo, 
    (Select MAX(idveiculoHistorico)
    From Tabela_VeiculoHistorico
    Where idveiculo = vh.idveiculo),
    (Select MAX(idveiculoHistorico)
    From Tabela_VeiculoHistorico
    Where idveiculo = vh.idveiculo
    and idveiculoHistorico < (SELECT MAX(idveiculoHistorico)
    FROM Tabela_VeiculoHistorico
    WHERE idveiculo = vh.idveiculo)),
    vh.idCidadePais, vh.Placa
    FROM Tabela_VeiculoHistorico vh (NOLOCK)
    Join Tabela_Veiculo v (NOLOCK) ON v.idVeiculo = vh.idVeiculo
    WHERE v.idCidadePais <> 1
    And Year(v.DataInclusao) = 2018


    SELECT * From @Temp


    Porem esta demorando em torno de 1h, 
    Alguem tem outra ideia melhor?

    Maricelmo

    quarta-feira, 12 de dezembro de 2018 17:33

Respostas

  • Experimente dessa forma:

    with CTE_RN as
    (
        select 
            vh.idVeiculoHistorico,
            vh.idVeiculo,
            vh.idCidadePais, 
            vh.Placa,
            row_number() over(partition by vh.idVeiculo order by vh.idVeiculoHistorico desc) as RN
        from Tabela_Veiculo v
        inner join Tabela_VeiculoHistorico vh
            on vh.idVeiculo = v.idVeiculo
        where
            v.idCidadePais <> 1 And 
            Year(v.DataInclusao) = 2018
    )
    
    INSERT INTO @Temp (idVeiculoHistorico, idVeiculo, idCidadePais, Placa)
    
    Select idVeiculoHistorico, idVeiculo, idCidadePais, Placa From CTE_RN WHERE RN < 3

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 14 de dezembro de 2018 14:40

Todas as Respostas

  • Boa tarde,

    Seguem 2 sugestões para testes:

    with CTE_Veiculos as
    (
        select
            v.idVeiculo,
            u.idVeiculoHistorico as idVeiculoHistoricoUlt
            p.idVeiculoHistorico as idVeiculoHistoricoPen
        from Tabela_Veiculo v
        outer apply
        (
            select top(1)
                vh.idVeiculoHistorico
            from Tabela_VeiculoHistorico vh
            where
                vh.idVeiculo = v.idVeiculo
            order by
                vh.idVeiculoHistorico desc
        ) as u
        outer apply
        (
            select top(1)
                vh.idVeiculoHistorico
            from Tabela_VeiculoHistorico vh
            where
                vh.idVeiculo = v.idVeiculo and
                vh.idVeiculoHistorico < u.idVeiculoHistorico
            order by
                vh.idVeiculoHistorico desc
        ) as p
        where
            v.idCidadePais <> 1 And 
            Year(v.DataInclusao) = 2018
    )
    
    select 
        vh.idVeiculoHistorico, 
        vh.idVeiculo, 
        cv.idVeiculoHistoricoUlt,
        cv.idVeiculoHistoricoPen,
        vh.idCidadePais, 
        vh.Placa
    from CTE_Veiculos cv
    inner join join Tabela_VeiculoHistorico vh
        on vh.idVeiculo = cv.idVeiculo

    with CTE_RN as
    (
        select 
            vh.idVeiculo,
            vh.idVeiculoHistorico,
            row_number() over(partition by vh.idVeiculo order by vh.idVeiculoHistorico desc) as RN
        from Tabela_Veiculo v
        inner join Tabela_VeiculoHistorico vh
            on vh.idVeiculo = v.idVeiculo
        where
            v.idCidadePais <> 1 And 
            Year(v.DataInclusao) = 2018
    )
    
    select
        vh.idVeiculoHistorico, 
        vh.idVeiculo, 
        u.idVeiculoHistorico,
        p.idVeiculoHistorico,
        vh.idCidadePais, 
        vh.Placa
    from Tabela_Veiculo v
    inner join Tabela_VeiculoHistorico vh
        on vh.idVeiculo = v.idVeiculo
    left join CTE_RN u
        on u.idVeiculo = v.idVeiculo and u.RN = 1
    left join CTE_RN p
        on p.idVeiculo = v.idVeiculo and p.RN = 2
    WHERE
        v.idCidadePais <> 1 and
        Year(v.DataInclusao) = 2018

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex quarta-feira, 12 de dezembro de 2018 18:23
    quarta-feira, 12 de dezembro de 2018 18:22
  • ola.

    Gapimex.

    Obrigado por sua ajuda!
    Porem, Na Primeira sugestão esta dando este erro.

    Msg 102, Level 15, State 1, Line 104
    Incorrect syntax near 'p'.
    Msg 156, Level 15, State 1, Line 113
    Incorrect syntax near the keyword 'order'.
    Msg 156, Level 15, State 1, Line 124
    Incorrect syntax near the keyword 'order'.
    Msg 156, Level 15, State 1, Line 140
    Incorrect syntax near the keyword 'join'.

    Ja na segunda sugestão, esta mostrando todos os registros de um veiculo
    por exemplo. um veiculo tem 09 registros, e esta mostrando todos os 9.
    Enquanto, eu gostaria que mostrasse apenas o ultimo registro e o penúltimo.

    Maricelmo

    quinta-feira, 13 de dezembro de 2018 12:09
  • Experimente fazer uns testes com a query abaixo para ver se é obtido o resultado esperado:

    with CTE_RN as
    (
        select 
            vh.idVeiculo,
            vh.idVeiculoHistorico,
            vh.idCidadePais, 
            vh.Placa,
            row_number() over(partition by vh.idVeiculo order by vh.idVeiculoHistorico desc) as RN
        from Tabela_Veiculo v
        inner join Tabela_VeiculoHistorico vh
            on vh.idVeiculo = v.idVeiculo
        where
            v.idCidadePais <> 1 And 
            Year(v.DataInclusao) = 2018
    )
    
    select * from CTE_RN WHERE RN < 3
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 13 de dezembro de 2018 12:33
  • Ola,

    Gapimex.

    Como faço para inserir em uma tabela temporária os resultado deste script.
    Estou tentando assim.

    INSERT INTO @Temp (idVeiculoHistorico, idVeiculo, idCidadePais, Placa)
    with CTE_RN as
    (
        select 
            vh.idVeiculoHistorico,
            vh.idVeiculo,
            vh.idCidadePais, 
            vh.Placa,
            row_number() over(partition by vh.idVeiculo order by vh.idVeiculoHistorico desc) as RN
        from Tabela_Veiculo v
        inner join Tabela_VeiculoHistorico vh
            on vh.idVeiculo = v.idVeiculo
        where
            v.idCidadePais <> 1 And 
            Year(v.DataInclusao) = 2018
    )

    Select idVeiculoHistorico, idVeiculo, idCidadePais, Placa From CTE_RN WHERE RN < 3

    Maricelmo


    • Editado Maricelmo sexta-feira, 14 de dezembro de 2018 12:09
    sexta-feira, 14 de dezembro de 2018 12:08
  • Experimente dessa forma:

    with CTE_RN as
    (
        select 
            vh.idVeiculoHistorico,
            vh.idVeiculo,
            vh.idCidadePais, 
            vh.Placa,
            row_number() over(partition by vh.idVeiculo order by vh.idVeiculoHistorico desc) as RN
        from Tabela_Veiculo v
        inner join Tabela_VeiculoHistorico vh
            on vh.idVeiculo = v.idVeiculo
        where
            v.idCidadePais <> 1 And 
            Year(v.DataInclusao) = 2018
    )
    
    INSERT INTO @Temp (idVeiculoHistorico, idVeiculo, idCidadePais, Placa)
    
    Select idVeiculoHistorico, idVeiculo, idCidadePais, Placa From CTE_RN WHERE RN < 3

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 14 de dezembro de 2018 14:40
  • Experimente dessa forma:

    with CTE_RN as
    (
        select 
            vh.idVeiculoHistorico,
            vh.idVeiculo,
            vh.idCidadePais, 
            vh.Placa,
            row_number() over(partition by vh.idVeiculo order by vh.idVeiculoHistorico desc) as RN
        from Tabela_Veiculo v
        inner join Tabela_VeiculoHistorico vh
            on vh.idVeiculo = v.idVeiculo
        where
            v.idCidadePais <> 1 And 
            Year(v.DataInclusao) = 2018
    )
    
    INSERT INTO @Temp (idVeiculoHistorico, idVeiculo, idCidadePais, Placa)
    
    Select idVeiculoHistorico, idVeiculo, idCidadePais, Placa From CTE_RN WHERE RN < 3

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    Gapimex,

    Será que o uso das funções LAD() e LEAD() não poderiam ajudar?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 14 de dezembro de 2018 18:06