Dúvida com select

Scripts Diversos para o Oracle SQL*Plus. (Relacionado a ferramenta Oracle SQL*Plus, para questões de SQL, usar o forum SQL)
Responder
mmaniero
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Ter, 22 Jul 2008 3:09 pm
Localização: SP

Boa tarde pessoal,

Estou com uma dúvida para fazer uma consulta e precisava de uma ajuda....

Tenho uma base de dados parecida com essa aqui (é um exemplo):

Selecionar tudo

Nome - Data - texto
Marcio - 10/01/89 - babababa
Marcio - 05/08/04 - fdsfdsfdsfds
Jose - 04/03/02 - tetetetete
Maria - 03/07/09 - hdhdhdhdhd
Jose - 05/04/09 - hdhshshshs
Perceba que tenho nomes repetidos com datas diferentes. Queria fazer um select pegando a primeira incidencia do nome de acordo com a data. O resultado teria que ser assim, com esse exemplo:

Selecionar tudo

Nome - Data - texto
Marcio - 10/01/89 - babababa
Jose - 04/03/02 - tetetetete
Maria - 03/07/09 - hdhdhdhdhd
Como posso fazer isso? tentei fazer um select para trazer esse resultado, porém não tive sucesso.

Qualquer ajuda será muito bem vinda.

Obrigado desde já.......
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

- Criação da tabela

Selecionar tudo

CREATE TABLE teste (nome VARCHAR2(100)
                   ,data DATE
                   ,texto VARCHAR2(1000));
                   
- Popular

Selecionar tudo

INSERT INTO teste VALUES ('Marcio',TO_DATE('10/01/89','dd/mm/rrrr'),' babababa ');
INSERT INTO teste VALUES ('Marcio',TO_DATE('05/08/04','dd/mm/rrrr'),'fdsfdsfdsfds '); 
INSERT INTO teste VALUES ('Jose',TO_DATE('04/03/02','dd/mm/rrrr'),'tetetetete '); 
INSERT INTO teste VALUES ('Maria',TO_DATE('03/07/09','dd/mm/rrrr'),'hdhdhdhdhd '); 
INSERT INTO teste VALUES ('Jose',TO_DATE('05/04/09','dd/mm/rrrr'),'hdhshshshs ');

COMMIT;
- De acordo com tua modelagem, criei este exemplo abaixo:

Selecionar tudo

SELECT DISTINCT t1.nome,
       (SELECT data
          FROM teste
         WHERE nome = t1.nome
           AND ROWNUM = 1) data
  FROM teste t1
  ORDER BY t1.nome;
Espero que o ajude.
Nota: Modelagem apenas para ilustrar o exemplo, beleza?

Qualquer coisa, manda pra gente.
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

esta tabela não possui nenhum ID ?
porque a ordem da consulta depende muito do order by passado nela... se você não pode order by, o banco organiza de qualquer jeito...
mais isso as vezes pode mudar ai você perde a estrutura toda...

caso esta tabela possua um ID você pode fazer assim:

Selecionar tudo

select *
  from teste t
 where t.id = (select max(t2.id) from teste where t2.name = t.name)
no where do subselect você pode fazer com os ids também....
mmaniero
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Ter, 22 Jul 2008 3:09 pm
Localização: SP

Caras, muito obrigado.....O select ficou show de bola, já estou aplicando ele aqui.....

De novo, muito obrigado.....

Falou....
mmaniero
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Ter, 22 Jul 2008 3:09 pm
Localização: SP

Pessoal, agora me surgiu uma dúvida (pois me pediram para acrescentar umas coisas no select) que não estou conseguindo resolver:

Se fizer esse mesmo select juntamente com um count de um outra tabela via join? tentei fazer aqui, mas sempre tenho erro...

tipo (melhor exemplificar q senão fica confuso):

Considerando a tabela teste da mensagem anterior:


tabela 2:

Selecionar tudo

nome-produtos
Marcio-veja
Marcio-computador
Jose-vela
Maria-abajour
quero fazer o seguinte (partindo do select que o Trevisolli montou):

Selecionar tudo

SELECT DISTINCT t1.nome, 
       (SELECT data 
          FROM teste 
         WHERE nome = t1.nome 
           AND ROWNUM = 1) data, count(visitas) 
  FROM teste t1, tabela2 t2 where t1.nome = t2.nome 
  group by t1.nome ORDER BY t1.data; 
Esse select que eu montei não funciona, mas faria a função que agora estou precisando além da que eu questionei. Como poderia fazer isso?

O resultado teria que ser isso:

Selecionar tudo

Nome - Data - count(produtos)
Marcio - 10/01/89 - 2
Jose - 04/03/02 - 2 
Maria - 03/07/09 - 1
Qualquer coisa já ajuda bastante.

Desde já obrigado.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Faz uns testes ai:

Selecionar tudo

SELECT DISTINCT t1.nome, 
       (SELECT data 
          FROM teste 
         WHERE nome = t1.nome 
           AND ROWNUM = 1) data ,
       (SELECT COUNT(1) 
          FROM teste 
         WHERE nome = t1.nome ) visita            
  FROM teste t1 
  ORDER BY t1.nome; 
Responder
  • Informação
  • Quem está online

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