none
Filtrar max(date) com condições. RRS feed

  • Pergunta

  • Caros,  Bom dia,

    Preciso filtrar um tipo de status de uma tabela que contem varios tipos de ações. " tabela log"

    Ex: Preciso selecionar dados da coluna ação da tabela log somente quando o ultimo status esta parado em "agendou"..

    Pode ocorrer que depois da ação "agendou" possam ter outras ações, neste caso não deveras trazer a seleção..

    Somente preciso filtrar o status "agendou"  quando este for em um codigo o ultimos status desta ação.

    segue abaixo um pequeno exemplo. Neste exemplo preciso que a query retornasse apenas com a ultima linha do codigo 100901 visto que neste  na coluna ação o ultimo status é o "agendou"  e não tem mais ação abaixo do "agendou"

    Já no codigo 100885 a ultima ação não é agendou, e neste caso este não deveras ser trazido na pesquisa. 


    codmat

    idlog

    Dtlog

    acao

    100885

    10095

    29/11/2010 15:17

    Acessou

    100885

    10096

    29/11/2010 15:17

    Alterou

    100885

    10097

    29/11/2010 15:17

    AGENDOU

    100885

    10098

    29/11/2010 15:17

    Saneou Atributos

    100885

    10099

    29/11/2010 15:17

    AGENDOU

    100885

    10100

    29/11/2010 15:17

    Saneou Atributos

    -----------

    100901

    10090

    29/11/2010 15:15

    Acessou

    100901

    10091

    29/11/2010 15:15

    Alterou

    100901

    10092

    29/11/2010 15:15

    Agendou

    100901

    10093

    29/11/2010 15:15

    Saneou Atributos

    100901

    10090

    29/11/2010 15:15

    Acessou

    100901

    10094

    29/11/2010 15:15

    AGENDOU

    Qsquer dúvidas estoua disposição e de antemão ja agradeço o possivel ajuda e disposição...

    Att,

    Osman

    terça-feira, 30 de janeiro de 2018 10:32

Respostas

Todas as Respostas

  • Deleted
    terça-feira, 30 de janeiro de 2018 11:04
  • Preciso selecionar dados da coluna ação da tabela log somente quando o ultimo status esta parado em "agendou"

    Osman, há algumas formas de resolver o que necessita, variando inclusive de acordo com a versão do SQL Server.

    -- código #1
    with Selec as (
    SELECT codmat, idlog, Dtlog, 
           seq= row_number() over (partition by codmat order by idlog desc)
      from [tabela log]
    )
    SELECT codmat, idlog, Dtlog
      from Selec
      where seq = 1 
            and acao = 'agendou';

     
    Outra forma:

    -- código #2 v2
    SELECT T1.codmat, T1.idlog, T1.Dtlog
      from [tabela log] as T1
      where T1.acao = 'agendou'
            and not exists (SELECT * 
                              from [tabela log] as T2
                              where T2.codmat = T1.codmat
                                    and T2.idlog > T1.idlog);
     

    Eis uma terceira forma, que é específica para SQL Server 2012 (e versões posteriores):

    -- código #3
    SELECT codmat, idlog, Dtlog
      from [tabela log] 
      where acao = 'agendou'
            and lead(idlog) over (partition by codmat order by idlog) is null;
     

    Analisando o plano de execução real você pode escolher qual das sugestões é a mais eficiente para o seu caso.

    PS: não testei as sugestões acima; pode ter erro(s). Teste-as com atenção.


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    Osman,

    Fazendo uma análise simples e rápida, acredito que a primeira sugestão do José Diz seja a mais indicada, quanto menos condições e análises a serem feitas em tempo de execução o SQL Server vai trabalhar melhor.

    Se você observar a primeira sugestão utilizando uma CTE poderá justamente aplicar este cenário, onde o SQL Server identificação, analisa as condições e posteriormente executa o que precisa ser apresentando em tela.


    Pedro Antonio Galvao 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]

    terça-feira, 30 de janeiro de 2018 11:54
  • Bom dia, Jose DiZ,

    Grato por socorrer-me  novamente.. 

    Não sei bem o motivo, pois estou engatinhando ainda no SQL.
    No 1º codigo, apresentou o seguinte erro. -->Invalid object name 'tabela log'.
    tirei as chaves [] e tabela e apresentou --> Invalid column name 'acao'.
    No 2º codigo, tirei as chaves [] e tabela e a principio trouxe os resultados... 
    No 3º codigo, apresentou o seguinte erro--> 'lead' is not a recognized built-in function name.
    Obs.: não estou utilizando o SQL server, e sim um programa chamado "Query Execute" e este e bem limitado..
    No seu aguardo..

    terça-feira, 30 de janeiro de 2018 12:20
  • Bom dia, Pedro,

    Sim, entendo seu parecer e agradeço a orientação..

    Gostaria sim de usar a query mais eficiente, porem esta no momento apresenta um pequeno erro, o qual ainda não consegui contornar.

    No 1º codigo, apresentou o seguinte erro. -->Invalid object name 'tabela log'.

    tirei as chaves [] e tabela e apresentou --> Invalid column name 'acao'.

    Informei este ao Jose Diz, e estou no aguardo de uma possivel solução deste erro.

    Caso queira apresentar uma solução para este, serei grato.

    Att,

    Osman



    terça-feira, 30 de janeiro de 2018 12:56
  • Deleted
    terça-feira, 30 de janeiro de 2018 13:10
  • Jose Diz--> (  Nos 3 códigos é necessário substituir 
        [tabela log]
    pelo nome da tabela.)

    Osman--> Ok subistituido, mas ...  

    No 1º codigo, apresentou o seguinte erro. -->Invalid object name 'tabela log'.

    tirei as chaves [] e tabela e apresentou --> Invalid column name 'acao'.

    Jose Diz--> Qual é o gerenciador de banco de dados?

    Osman -->Microsoft SQL Server 2008 R2 (SP3) - 10.50.6529.0 (X64) 


    No aguardo de parecer..



    terça-feira, 30 de janeiro de 2018 15:10
  • Deleted
    terça-feira, 30 de janeiro de 2018 16:32
  • No 1º codigo, apresentou o seguinte erro. -->Invalid object name 'tabela log'.

    tirei as chaves [] e tabela e apresentou --> Invalid column name 'acao'.--> 

    .

    quiz dizer que tirei a chave e a palavra tabela..  

    from [talela log] --> from log

    select top 1 * from log

    IDLOG  NRUSU  PROGRAMA  DTLOG  GRUCOD  MODCOD  CODMAT   PROTOCOLO   ACAO OBS  TESTE





    • Editado Osman.Almeida terça-feira, 30 de janeiro de 2018 16:56
    terça-feira, 30 de janeiro de 2018 16:46
  • Deleted
    • Marcado como Resposta Osman.Almeida quarta-feira, 31 de janeiro de 2018 11:43
    terça-feira, 30 de janeiro de 2018 19:14
  • Bom dia, Jose Diz,

    O Codigo 1 e 2 atende-me.

    Qto 3, servira de aprendizagem e quando oportuno utilizarei este para testa-lo.

    Mais uma vez grato pelo apoio, empenho e disposição em ajudar-nos.

    Att,
    quarta-feira, 31 de janeiro de 2018 11:43