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:
mas precisava que retornasse:
Enviado: Ter, 13 Out 2009 2:48 pm
por dr_gori
Eu não entendi a lógica que existe neste resultado:
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
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
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...
Qualquer dúvida estou a disposição...