problema em montar query

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
esttevan
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Out 2009 10:11 am
Localização: Nova Hartz - RS

preciso montar uma query que retorne o maior valor ate que altere o valor de uma
coluna. acho melhor com um exemplo:

Selecionar tudo

with t1 as( select 1 Col1, 'A' Col2 from dual
UNION
select 2, 'B' from dual
UNION
select 3, 'B' from dual
UNION
select 4, 'A' from dual )
select
col2,
min (col1)||'-'||max(col1)
from
T1
GROUP BY
col2
isto retorna:

Selecionar tudo

A 1-4
B 2-3
mas precisava que retornasse:

Selecionar tudo

A 1-1
B 2-3
A 4-4
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

Eu não entendi a lógica que existe neste resultado:

Selecionar tudo

A 1-1
B 2-3
A 4-4 

A 1-1 --> sendo 1 o MIN que existe pra A.
A 4-4 --> sendo 4 o MAX existente pra A.
B 2-3 --> ???? o que é isso ?
esttevan
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Out 2009 10:11 am
Localização: Nova Hartz - RS

Realmente acho que faltou informacoes.
Preciso dos maiores e menores sempre que houver quebra.
No exemplo, o maior e o menor ate que Col2('A') foi alterada era 1-1, já quando a col2('B') alterou novamente era 2-3 (menor e maior) e quando terminou a col2('A') o menor e maoir era 4-4.

já tentei com partition by no over mas não consegui.

Fico esperando ajuda.
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Oi esttevan;

Eu peguei seu exemplo, li sua explicação e não consegui entender o que você precisa.

O que você chama de "quebra" ?

Quais informações você precisa, em qual ordem e em qual momento?
esttevan
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Out 2009 10:11 am
Localização: Nova Hartz - RS

Chamei de quebra a col2.
Toda vez que a col2 mudar preciso da maior e menor sequencia(col1), podendo se repetir o valor da col2.
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Velho, vou te dizer que está complicado de entender o que você precisa. Vamos lá.

Imaginando que você tenha a sequência abaixo:

Selecionar tudo

with t1 as( select 1 Col1, 'A' Col2 from dual 
            UNION 
            select 2, 'B' from dual 
            UNION 
            select 3, 'B' from dual 
            UNION 
            select 4, 'A' from dual 
            UNION 
            select 7, 'B' from dual 
            UNION 
            select 2, 'A' from dual
           ) 
Como deve ser a saída do que você precisa?
esttevan
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 07 Out 2009 10:11 am
Localização: Nova Hartz - RS

a col1 não se repete, mas seria assim

Selecionar tudo

A 1-1
B 2-3
A 4-4
B 7-7
A 2-2
mas não pode repetir

mais um exemplo:

Selecionar tudo

with t1 as( select 1 Col1, 'A' Col2 from dual
            UNION
            select 2, 'A' from dual
            UNION
            select 3, 'B' from dual
            UNION
            select 4, 'B' from dual
            UNION
            select 5, 'B' from dual
            UNION
            select 6, 'A' from dual
            UNION
            select 7, 'A' from dual
           ) 
saida

Selecionar tudo

A 1-2
B 3-5
A 6-7
Tomara que tenha ajudado
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

está...entendi...

Você precisa listar em que número A começa e onde A termina, até que ele troque de letra.

Depois onde B começa e onde B termina.

E assim sucessivamente conforme as letras forem alternando, até o final.

Você está usando SQL ou PL/SQL? Vai usar isso em alguma procedure/função ou teria que resultar em um select mesmo?

Velho, não acho que dê pra fazer isso em um select comum... vou pensar aqui e qualquer coisa eu posto aqui.
borracha
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Sex, 11 Dez 2009 10:48 pm
Localização: São Paulo - SP
Se trabalho fosse bom, não receberíamos para fazer-lo...

Amigão, não se você ainda possui o problema uma solução possível utilizando o ultimo exemplo que você passou é a seguinte:

Selecionar tudo

with t1 as( select 1 id, 1 Col1, 'A' Col2 from dual 
            UNION 
            select 1 ,2, 'A' from dual 
            UNION 
            select 2 ,3, 'B' from dual 
            UNION 
            select 2 ,4, 'B' from dual 
            UNION 
            select 2 ,5, 'B' from dual 
            UNION 
            select 3 ,6, 'A' from dual 
            UNION 
            select 3 ,7, 'A' from dual 
           )  
select 
col2, 
min (col1)||'-'||max(col1) 
from 
T1 
GROUP BY 
col2,id 


Criei um atributo adicional no seu select chamado id, esse id é um sequencial que só muda quando o valor de col1 for alterado, caso você popule a tabela em um programa ou PL/SQL é até fácil fazer isso.

Criado esse atributo inclui ele no group by utilizando a mesma base criada e funciona...

Selecionar tudo

A|1-2
B|3-5
A|6-7
Qualquer dúvida estou a disposição...
Responder
  • Informação
  • Quem está online

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