none
Trazer último registro. RRS feed

  • Pergunta

  • Transacao    DOCUMENTO     OBJETO     ID                     Data de   Aprovação
    EINKBELEG  4501155532     88311309  40042124      10.10.2011          09:17:44
    EINKBELEG  4501155532     88311490  40042124      10.10.2011          09:19:35
    EINKBELEG  4501155532     99039607  40042124      28.12.2011          06:28:29
    EINKBELEG  4501155532     100739963 40042124     06.01.2012          05:40:36
    EINKBELEG  4501155532     100739989 40042124     06.01.2012          05:41:09
    EINKBELEG  4501155532     100743996 20202868     06.01.2012          06:16:59 

    EINKBELEG  4501155532     100751023 40123556    06.01.2012           08:11:32 

    Boa Tarde a todos,

    Estou com uma dúvida para efetuar uma query.

    Na tabela acima eu tenho as aprovações dos documentos de compra da empresa.

    Cada documento passa por uma rota de aprovação e termina com um aprovador final (no caso acima 40123556 no dia 06/01 as 08:11.

    Pergunta existe uma forma de eu selecionar somente os documentos com seu último aprovador?

    ou seja, vou ter diversos documentos, porém vou trazer somente a última aprovação feita.

    Obrigado


    Erick Egea

    terça-feira, 5 de fevereiro de 2013 19:34

Respostas

  • Boa tarde,

    Experimente mais ou menos desta forma:

    with CTE_N as
    (
        select
            Transacao,
            Documento,
            Objeto,
            ID,
            DataAprovacao,
            ROW_NUMBER() OVER(PARTITION BY Documento ORDER BY DataAprovacao DESC) as RowNum
        from Tabela
    )
    
    select * from CTE_N
    where RowNum = 1

    Espero que ajude.


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

    terça-feira, 5 de fevereiro de 2013 19:41
  • Erick, voce pode pegar a ultima data conforme abaixo, mas se voce precisar do ObjetoID para cada

    objeto ele retornaria uma linha, veja se te atende:

    select Transacao, Documento, Max([Data de aprovacao] from Tabela group by Transacao, Documento



    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 5 de fevereiro de 2013 19:43

Todas as Respostas

  • Boa tarde,

    Experimente mais ou menos desta forma:

    with CTE_N as
    (
        select
            Transacao,
            Documento,
            Objeto,
            ID,
            DataAprovacao,
            ROW_NUMBER() OVER(PARTITION BY Documento ORDER BY DataAprovacao DESC) as RowNum
        from Tabela
    )
    
    select * from CTE_N
    where RowNum = 1

    Espero que ajude.


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

    terça-feira, 5 de fevereiro de 2013 19:41
  • Erick, voce pode pegar a ultima data conforme abaixo, mas se voce precisar do ObjetoID para cada

    objeto ele retornaria uma linha, veja se te atende:

    select Transacao, Documento, Max([Data de aprovacao] from Tabela group by Transacao, Documento



    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 5 de fevereiro de 2013 19:43
  • Erick, voce pode pegar a ultima data conforme abaixo, mas se voce precisar do ObjetoID para cada

    objeto ele retornaria uma linha, veja se te atende:

    select Transacao, Documento, Max([Data de aprovacao] from Tabela group by Transacao, Documento



    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    Boa Tarde Alexandre,

    Exatamente, eu vou precisar do ID para cada documento. Ou seja, preciso saber o último cara que aprovou. Dessa forma eu não consigo trazer, certo?


    Erick Egea

    quarta-feira, 6 de fevereiro de 2013 16:28
  • Boa tarde,

    Experimente mais ou menos desta forma:

    with CTE_N as
    (
        select
            Transacao,
            Documento,
            Objeto,
            ID,
            DataAprovacao,
            ROW_NUMBER() OVER(PARTITION BY Documento ORDER BY DataAprovacao DESC) as RowNum
        from Tabela
    )
    
    select * from CTE_N
    where RowNum = 1

    Espero que ajude.


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

    Desculpe me a ignorância (Sou iniciante total em SQL), o que seria o CTE_N ?

    Obrigado


    Erick Egea

    quarta-feira, 6 de fevereiro de 2013 16:30
  • Hoje minha tabela está dessa forma:


    OBJECTCLAS OBJECTID CHANGENR USERNAME UDATE UTIME
    EINKBELEG 4501292754 100498693 40166084  20120104 102633
    EINKBELEG 4501292829 100235032 40166084 20120102 65920
    EINKBELEG 4501293429 100227831 40172867 20120102 44210
    EINKBELEG 4501294104 100629405 40123556 20120105 80645
    EINKBELEG 4501294111 100629389 40123556 20120105 80641
    EINKBELEG 4501294360 100271611 20201998 20120102 155438
    EINKBELEG 4501294428 100526357 40123556 20120104 152619
    EINKBELEG 4501295420 100188515 20200968 20120102 40128
    EINKBELEG 4501295659 100526946 40123556 20120104 152756
    EINKBELEG 4501295694 100498399 40166084 20120104 102121
    EINKBELEG 4501295712 100735652 40172867 20120106 043944
    EINKBELEG 4501295712 101233150 40172777 20120110 104303

    Alguns documentos vão aparecer repetidos, por exemplo: 4501295712 o usuário (40172867) aprovou ele no dia 06/01/2012 às 4:39 e depois o outro usuário 40172777 aprovou dia 10/01/2012 às 10:43....

    ou seja quando eu fizer o select, ele vai me trazer somente o documento com o último aprovador.


    Erick Egea

    quarta-feira, 6 de fevereiro de 2013 16:44
  • Sobre CTE confira as páginas abaixo:

    http://msdn.microsoft.com/en-us/library/ms190766.aspx

    http://www.codeproject.com/Articles/265371/Common-Table-Expressions-CTE-in-SQL-SERVER-2008

    A query que sugeri ficaria desta forma com a sua tabela:

    with CTE_N as
    (
        select
            ObjectClas,
            ObjectId,
            ChangeNr,
            UserName,
            UDate,
            UTime,
            ROW_NUMBER() OVER(PARTITION BY ObjectId ORDER BY UDate DESC, UTime DESC) as RowNum
        from Tabela
    )
    
    select * from CTE_N
    where RowNum = 1

    Espero que ajude.

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

    quarta-feira, 6 de fevereiro de 2013 17:22