none
Pegar o maior de uma tabela RRS feed

  • Pergunta

  • Bom dia,

    Gostaria de fazer uma pergunta sobre uma query.

    Para exemplificar, criei duas tabelas de teste (TESTECLIENTE e DATATESTECLIENTE), na tabela DATATESTECLIENTE várias informações referente a tabela  TESTECLIENTE.

    Gostaria de retornar o maior valor da tabela DATATESTECLIENTE  para cada um dos registro na tabela TESTECLIENTE. Quando faço a consulta ela fico conforme abaixo.

    Para resolver o problema, costumo usar uma subquery, conforme abaixo. O problema é que quando tem muitos registro afeta muito o desempenho.

    Existe uma forma melhor de fazer isso?

    Agradeço desde já.

    terça-feira, 22 de setembro de 2015 14:45

Respostas

  • Boa tarde,

    galves.rod, se você precisa retornar apenas uma coluna da segunda tabela (no seu exemplo a DataTesteCliente), acho que você poderia adicionar a subquery antes do primeiro From, removendo também o Join.

    Se você precisa retornar mais de uma coluna, pode utilizar a sugestão do William, ou dependendo do caso também pode utilizar o operador Apply. Ex:

    select * from TesteCliente as a
    cross apply
    (
        select top(1) * from DataTesteCliente as aa
        where aa.CodTeste = a.CodTeste
        order by DataTeste desc
    ) as ca

    Espero que seja útil.


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

    • Sugerido como Resposta Marcos SJ terça-feira, 22 de setembro de 2015 19:04
    • Marcado como Resposta Marcos SJ quarta-feira, 23 de setembro de 2015 13:29
    terça-feira, 22 de setembro de 2015 15:17
  • deste jeito:

    with LINHAS as
    (
    select *
        row_number() over(partition by A.CODTESTE by DATATESTE) as LINHA
     
    from TESTECLIENTE A INNER JOIN DATATESTECLIENTE B on A.CODTESTE=B.CODTESTE)
     
    )
    select * from LINHAS
    where LINHA = 1
    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Sugerido como Resposta Marcos SJ terça-feira, 22 de setembro de 2015 19:04
    • Marcado como Resposta Marcos SJ quarta-feira, 23 de setembro de 2015 13:29
    terça-feira, 22 de setembro de 2015 14:52

Todas as Respostas

  • deste jeito:

    with LINHAS as
    (
    select *
        row_number() over(partition by A.CODTESTE by DATATESTE) as LINHA
     
    from TESTECLIENTE A INNER JOIN DATATESTECLIENTE B on A.CODTESTE=B.CODTESTE)
     
    )
    select * from LINHAS
    where LINHA = 1
    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Sugerido como Resposta Marcos SJ terça-feira, 22 de setembro de 2015 19:04
    • Marcado como Resposta Marcos SJ quarta-feira, 23 de setembro de 2015 13:29
    terça-feira, 22 de setembro de 2015 14:52
  • Boa tarde,

    galves.rod, se você precisa retornar apenas uma coluna da segunda tabela (no seu exemplo a DataTesteCliente), acho que você poderia adicionar a subquery antes do primeiro From, removendo também o Join.

    Se você precisa retornar mais de uma coluna, pode utilizar a sugestão do William, ou dependendo do caso também pode utilizar o operador Apply. Ex:

    select * from TesteCliente as a
    cross apply
    (
        select top(1) * from DataTesteCliente as aa
        where aa.CodTeste = a.CodTeste
        order by DataTeste desc
    ) as ca

    Espero que seja útil.


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

    • Sugerido como Resposta Marcos SJ terça-feira, 22 de setembro de 2015 19:04
    • Marcado como Resposta Marcos SJ quarta-feira, 23 de setembro de 2015 13:29
    terça-feira, 22 de setembro de 2015 15:17
  • Sim, muito útil. Muito obrigado.
    quarta-feira, 23 de setembro de 2015 14:45
  • Boa tarde,

    Excelente solução, muito obrigado.

    Atte;

    quarta-feira, 23 de setembro de 2015 14:46