Página 1 de 1

problema em montar query

Enviado: Qua, 07 Out 2009 10:17 am
por esttevan
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

Enviado: Ter, 13 Out 2009 2:48 pm
por dr_gori
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 ?

Enviado: Ter, 13 Out 2009 3:09 pm
por esttevan
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.

Enviado: Seg, 19 Out 2009 2:37 pm
por Toad
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?

Enviado: Seg, 19 Out 2009 3:10 pm
por esttevan
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.

Enviado: Seg, 19 Out 2009 4:13 pm
por Toad
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?

Enviado: Seg, 19 Out 2009 4:30 pm
por esttevan
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

Enviado: Seg, 19 Out 2009 4:40 pm
por Toad
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.

Enviado: Sáb, 12 Dez 2009 1:09 am
por borracha
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...