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
  

Mensagemem Qui, 21 Set 2006 10:15 am

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
marcoantoniorocha
Localização: São Carlos - SP

Marco Antonio Rocha

Mensagemem Qui, 21 Set 2006 10:25 am

Utilize uma subconsulta somente com o ID e a DATA dentro de um Select ID,MAX(DATA).
fbarros300472
Localização: sp

Mensagemem Qui, 21 Set 2006 10:38 am

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)

Código: Selecionar todos
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
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qui, 21 Set 2006 11:00 am

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

Código: Selecionar todos
CREATE TABLE TESTE (
  ID NUMBER,
  STATUS NUMBER,
  OUTRO_ID NUMBER,
  DATA DATE
);


Inserindo alguns registros de teste

Código: Selecionar todos
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 *

Código: Selecionar todos
        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

Código: Selecionar todos
        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
Localização: São Carlos - SP

Marco Antonio Rocha

Mensagemem Qui, 21 Set 2006 11:06 am

Acho que consegui:

Código: Selecionar todos
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... :-)
marcoantoniorocha
Localização: São Carlos - SP

Marco Antonio Rocha


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


    Voltar para SQL

    Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron