Pessoal, boa tarde, tudo bem ? Estou com um problema aqui e gostaria da opinião de vocês e se possível, da ajuda de vocês... Eu tenho uma tabela, que tem registros que o range deles são próximos, e caso uma determinada coluna seja igual, eu preciso agrupar eles. Por exemplo: inicial - final - prazo 01 - 09 - 0210 - 19 - 0320 - 29 - 03 Nesse exemplo acima, o primeiro registro, o campo final é 9, se eu somar + 1, será o campo inicial do segundo registro, porém, o prazo do primeiro registro é 2 e o prazo do segundo registro é 3. Nesse caso, eu não agrupo, pego a primeira linha e insiro na segunda tabela.. Já o segundo registro, o campo final é 19, se eu somar + 1, dará o valor do campo inicial do terceiro registro e como os prazos são iguais (3), eu devo agrupar eles e inserir eles na segunda tabela, ficando assim o resultado: inicial - final - prazo 01 - 09 - 0210 - 29 - 03 Quando tem que agrupar, estou tendo dificuldade... Abaixo estou colocando os script's para melhor entendimento.
create table tabela (inicio number(8) not null, fim number(8) not null, prazo number(3) not null); create table tabela_agrupada (inicio number(8) not null, fim number(8) not null, prazo number(3) not null); insert into tabela(inicio, fim, prazo) values(1000000, 1000005, 5);insert into tabela(inicio, fim, prazo) values(510101, 510104, 4);insert into tabela(inicio, fim, prazo) values(510000, 510067, 4);insert into tabela(inicio, fim, prazo) values(510068, 510100, 3);insert into tabela(inicio, fim, prazo) values(1000006, 10000010, 5);insert into tabela(inicio, fim, prazo) values(810000, 810001, 5);insert into tabela(inicio, fim, prazo) values(810002, 810003, 5);insert into tabela(inicio, fim, prazo) values(810004, 810005, 5); declare v_inicio number(8); v_fim number(8); v_prazo number(3); v_prx_inicio number(8); v_prx_fim number(8); v_prx_prazo number(3); v_existe number(8); declare c1 cursor is select t.inicio, t.fim, t.prazo, lead(t.inicio - 1) over (order by t.inicio) prx_inicio, lead(t.fim) over (order by t.fim) prx_fim, lead(t.prazo) over (order by t.prazo) prx_prazo from tabela t order by t.inicio, t.fim, t.prazo; open c1; loop fetch c1 into v_inicio, v_fim, v_prazo, v_prx_inicio, v_prx_fim, v_prx_prazo; exit when c1%notfound if (v_prazo = v_prx_prazo) and (v_fim = v_prx_inicio) begin update tabela_agrupada set fim = v_prx_fim where inicio = v_inicio end; else begin insert into tabela_agrupada(inicio, fim, prazo) values v_inicio, v_fim, v_prazo; end; end loop; close c1; select * from tabela_agrupada Para o script acima, o resultado deverá ser: inicio - fim - prazo 1000000 - 10000010 - 5510101 - 510104 - 4510000 - 510067 - 4510068 - 510100 - 3810000 - 810005 - 5 [ ]s