Ir para conteúdo
Fórum Script Brasil
  • 0

Consulta com group by


Pedro Gaz

Pergunta

Bom dia, pessoal estou com uma dificuldade,

Tenho o seguinte banco:

img1.JPG

Preciso fazer um sql que me retorne a ultima ocorrencia de cada estaca, usei o seguinte SQL:

SELECT L1.estaca, L1.estatus, L1.data, L1.usuario
    FROM historico As L1
    INNER JOIN (
        SELECT estaca, MAX(data) As UltimaData
        FROM historico GROUP BY estaca) As L2
            ON L1.estaca = L2.estaca AND L1.data = L2.UltimaData
    ORDER BY L1.estaca ASC, L1.id DESC

O meu retorno quase correto foi:

img2.JPG

Como mostrado a estaca 10 retornou 2 registros, pelo fato de terem sido incluidos no mesmo dia, quando isso ocorrer preciso que seja feita essa condição pelo maior ID, no caso seria mostrada somente a estaca 16 com ID 6859..

Fico no aguardo. Obrigado

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Pedro,

Na sexta-feira tentei resolver este problema. Desculpe, mas acabei salvando na minha máquina e esqueçendo... rs.

O problema é que há dois filtros na consulta. você quer o MAX da data e se for igual, quer o MAX do Id. Tentei resolver utilizando um select apenas mas não consegui.

Consegui o MAX da Data, mas o Id vinha aleatório. Vou tentar resolver novamente.... :.)

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde Pedro,

É... realmente em um select não consegui resolver.

No exemplo que postou, perceba a estaca 16: a maior data é o Id=6858, mas o maior Id é o 6859. Se fizer apenas em um select, o resultado não constará esta estaca. Isto se deve por causa da interseção entre os MAX´s.

O que pode-se fazer: criar uma temporária para armazenar o 1º resultado. A partir dele, fazer o 2º filtro:

CREATE TABLE #Tmp (id INT, estaca INT, estatus INT, DATA DATETIME, usuario INT)

INSERT INTO #Tmp
SELECT L1.id, L1.estaca, L1.estatus, L1.data, L1.usuario
    FROM #historico As L1
    INNER JOIN (SELECT MAX(data) As UltimaData FROM #historico GROUP BY estaca) As L2
    ON L1.data = L2.UltimaData

SELECT L1.estaca, L1.estatus, L1.data, L1.usuario
    FROM #Tmp As L1 
    INNER JOIN (SELECT MAX(id) as Id FROM #Tmp GROUP BY estaca) L2
    ON L1.id = L2.id

Outra coisa. Percebi que a DATA não possui horas.

DICAS:

- No comando de INSERT na tabela, pode-se alterar os dados. Ao invés de passar apenas a data (onde o sql zera a hora) passar também dados de hora, minuto, segundo.

- Caso não tenha como fazer esta mudança, criar uma trigger com a seguinte cláusula: se a DATA for igual para o mesmo ID, pegar o MAX da DATA do ID e acrescentar 1 segundo.

Para estas duas alterações acima, apenas uma select com MAX da DATA resolverá o problema! :.)

Espero que ajude!!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...