Consulta - Pegar sempre ultima data

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
marcoantoniorocha
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 24 Abr 2006 9:33 am
Localização: São Carlos - SP
Marco Antonio Rocha

Pessoal,

Eu tenho uma tabela com mais ou menos a seguinte estrutura:

ID (NUMBER)
STATUS (NUMBER)
DATA (DATE)

Eu posso inserir várias vezes o mesmo ID, desde que o status não se repita.

Preciso agora fazer uma consulta ou view onde só sejam exibidos os últimos registros de cada ID.

Suponha que existam os seguintes registros na tabela:
ID: 1 / Status: 1 / Data: 18/09/2006
ID: 1 / Status: 2 / Data: 19/09/2006
ID: 1 / Status: 3 / Data: 20/09/2006
ID: 2 / Status: 2 / Data: 18/09/2006

A minha consulta deveria retornar somente:
ID: 1 / Status: 3 / Data: 20/09/2006
ID: 2 / Status: 2 / Data: 18/09/2006

Fico grato se alguém puder me ajudar.

Obrigado
fbarros300472
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 21 Set 2006 10:13 am
Localização: sp

Utilize uma subconsulta somente com o ID e a DATA dentro de um Select ID,MAX(DATA).
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Sim, isso funciona. Mas lembre-se que CASO exista 2 ID iguais com a mesma DATA e por acaso essa data for a maior, o SQL vai mostrar os 2 status - duplicar. (Não sei se o marcoantoniorocha quer isso)

Selecionar tudo

select x.*
from
  tabela x
, (select id, max(data) data
  from tabela   
  group by id  
  ) t 
where x.id = t.id
  and x.data = t.data
marcoantoniorocha
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 24 Abr 2006 9:33 am
Localização: São Carlos - SP
Marco Antonio Rocha

Obrigado a quem me respondeu, fui tentar novamente realizar minha consulta e reparei que o meu problema não é exatamente esse. Na verdade, o agrupamento é realizado por outro id.

Mesmo com as respostas já dadas, ainda não consegui obter o resultado desejado (mas vou continuar tentando :) )

Vou exemplificar melhor:

Criando a tabela

Selecionar tudo

CREATE TABLE TESTE (
  ID NUMBER,
  STATUS NUMBER,
  OUTRO_ID NUMBER,
  DATA DATE
);
Inserindo alguns registros de teste

Selecionar tudo

INSERT INTO TESTE VALUES (1, 0, 1, sysdate + 1);
INSERT INTO TESTE VALUES (2, 1, 1, sysdate + 2);
INSERT INTO TESTE VALUES (3, 2, 1, sysdate + 3);
INSERT INTO TESTE VALUES (4, 0, 2, sysdate);
INSERT INTO TESTE VALUES (5, 0, 3, sysdate);
SELECT *

Selecionar tudo

        ID     STATUS   OUTRO_ID DATA
---------- ---------- ---------- --------
         1          0          1 22/09/06
         2          1          1 23/09/06
         3          2          1 24/09/06
         4          0          2 21/09/06
         5          0          3 21/09/06
Os registros que preciso

Selecionar tudo

        ID     STATUS   OUTRO_ID DATA
---------- ---------- ---------- --------
         3          2          1 24/09/06
         4          0          2 21/09/06
         5          0          3 21/09/06
Mais uma vez, obrigado
marcoantoniorocha
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Seg, 24 Abr 2006 9:33 am
Localização: São Carlos - SP
Marco Antonio Rocha

Acho que consegui:

Selecionar tudo

select t1.*
from teste t1, (select outro_id, max(data) data from teste group by outro_id) t2
where t1.outro_id = t2.outro_id and t1.data = t2.data;
Aparentemente funciona. Vou fazer mais alguns testes... :-)
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes