Usuário com melhor resposta
Filtrar max(date) com condições.

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
Respostas
-
Deleted
- Marcado como Resposta Osman.Almeida quarta-feira, 31 de janeiro de 2018 11:43
Todas as Respostas
-
Deleted
- Sugerido como Resposta Lucio Rogerio SPBanned terça-feira, 30 de janeiro de 2018 11:13
-
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.
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]
-
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.. -
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
-
-
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..
-
-
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
-
Deleted
- Marcado como Resposta Osman.Almeida quarta-feira, 31 de janeiro de 2018 11:43
-