SQL Server - Encontrar huecos entre registros

 
Vista:

Encontrar huecos entre registros

Publicado por Olga (5 intervenciones) el 31/12/2008 21:21:05
Hola si alguien puede ayudarme por favor. Tengo muchos registros (muchos para mi son casi un millon) y en cada registro tengo el rango inicial y el rango final por ejemplo

create table rangos(rangoinicial int, rangofinal int)
insert into rangos (4,99)
insert into rangos (102,102)
insert into rangos (483,1074)

y lo que requiero encontrar es precisamente que numeros no estna en dichos rangos, suponiendo lso datos que acabo de mostrar la respuesta seria:

1,2,3,5,6,7...98,100,101,103,104...482,484,485...1073

algun experto en hacer queryes que me pueda ayudar? gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de roger

RE:Encontrar huecos entre registros

Publicado por roger (173 intervenciones) el 03/01/2009 02:37:37
no entiendo bien, si quieres los numeros que no esten en el rango no serian, 1,2,3, 100,101,103??????. Porque incluyes el 98,484,485?????
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Encontrar huecos entre registros

Publicado por Olga (5 intervenciones) el 03/01/2009 06:48:22
los puntos suspensivos son para no poner todos los numeros, por ejemplo con los datos que puse
create table rangos(rangoinicial int, rangofinal int)
insert into rangos (4,99)
insert into rangos (102,102)
insert into rangos (483,1074)

necesito un query que devuelva el 1,2,3 (el 4 no), 5,6,7 (asi hasta el 98), 101 (el 102 no), 103,104,105 (asi hasta el 482), etc

para no dejar dudas, lo que yo necesito es todos aquellos numeros que no estan entre 4 y 99 ni entre 102 y 102 ni entre 483 y 1074

esto es, segun la muestradesde el 1 hasta el 1074 que es el numero mayor

yo ya lo he resuelto con cursores y una funcion pero me tarda mucho tiempo, necesito hacelo con un query, es posible?

gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Encontrar huecos entre registros

Publicado por Olga (5 intervenciones) el 03/01/2009 06:51:19
perdon roger, tienes mucha razon en tu observacion. va de nuevo y espero no equivocarme y que no lo haga confuso otra vez :)

create table rangos(rangoinicial int, rangofinal int)
insert into rangos (4,99)
insert into rangos (102,102)
insert into rangos (483,1074)

necesito un query que devuelva el 1,2,3 (el 4 no), 100,101, (el 102 no), 103,104,105 (asi hasta el 482)

para no dejar dudas, lo que yo necesito es todos aquellos numeros que no estan entre 4 y 99 ni entre 102 y 102 ni entre 483 y 1074

de nuevo disculpa por mi error, ojala que haya sido clara esta vez. saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:Encontrar huecos entre registros

Publicado por roger (173 intervenciones) el 04/01/2009 04:12:23
pues en realidad no encuentro la forma si no es con cursores, y si se demora mucho con rangos muy altos, con los que tu pones de ejemplo no, pero con numeros grandes si. Te dejo el codigo de la forma como lo hice por si en algo te ayuda:

/*create table rangos(rangoinicial int, rangofinal int)
insert into rangos values(4,99)
insert into rangos values(102,102)
insert into rangos values(483,1074)
insert into rangos values(3500,3800)*/

set nocount on
Declare @tablaNumeros table(numero bigint)
Declare @inicial bigint, @final bigint,@numero bigint,@contador bigint
Declare cursorDatos cursor
for select rangoinicial,rangofinal from
rangos order by rangoinicial
Open cursorDatos
Fetch next from cursorDatos into @inicial ,@final
while @@FETCH_STATUS =0
begin
SET @contador = 1
while @contador <= @inicial
begin
if not exists(select numero from @tablaNumeros where numero = @contador)
and not exists(select rangoinicial from rangos where @contador between rangoinicial and rangofinal)
insert into @tablaNumeros values(@contador)
set @contador = @contador + 1
end
Fetch next from cursorDatos into @inicial ,@final
end
close cursorDatos
deallocate cursorDatos

select numero from @tablaNumeros
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Encontrar huecos entre registros

Publicado por Olga (5 intervenciones) el 04/01/2009 18:35:52
Si me sirve, gracias pero sigue tardando mucho. voy a intentar hacerlo con queryes porque si son muchos registros y el proceso no puede tardar mas de un par de minutos

de nuevo te agradezco la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Encontrar huecos entre registros

Publicado por Mau (67 intervenciones) el 04/01/2009 21:27:09
Hola Olga, si tienes SQL Server 2005 es muy sencillo. En caso que tengas una versión anterior, por favor dimelo y te paso otra solución un poco mas lenta.

En primer lugar debes crear una tabla auxiliar con numeros consecutivos. Esta tabla la llamaremos NUMBERS y este es el código:

DECLARE @N AS INT;
SELECT @N = 1000000;

WITH
T0 AS (SELECT 1 AS C UNION ALL SELECT 1),
T1 AS (SELECT 1 AS C FROM T0 AS A, T0 AS B),
T2 AS (SELECT 1 AS C FROM T1 AS A, T1 AS B),
T3 AS (SELECT 1 AS C FROM T2 AS A, T2 AS B),
T4 AS (SELECT 1 AS C FROM T3 AS A, T3 AS B),
T5 AS (SELECT 1 AS C FROM T4 AS A, T4 AS B),
NUMS AS (SELECT ROW_NUMBER() OVER(ORDER BY C) AS N FROM T5)

SELECT N INTO NUMBERS FROM NUMS WHERE N <= @N;

El valor de la variable @N lo debes asignar con el número máximo de tu campo RANGO_FINAL en tu tabla RANGOS. Esta inserción de datos es extremadamente rápida y solo dependerá de la velocidad de tu procesador, IO y RAM. En mi pc toma menos de 3 segundos insertar 1,000,000 de registros.

Una vez que hayas creado la tabla auxiliar NUMBERS entonces ejecuta este query que te devolverá aquellos registros que no se encuentran entre RANGO_INICIAL y RANGO_FINAL de tu tabla RANGOS

SELECT N.N
FROM NUMBERS N
WHERE NOT EXISTS(SELECT * FROM RANGOS R WHERE N.N BETWEEN R.RANGOINICIAL AND R.RANGOFINAL)
AND N.N < (SELECT MAX(RANGOFINAL) FROM RANGOS)
ORDER BY N.N

Espero que te haya servido. Cualquier duda me lo comentas por favor. Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Encontrar huecos entre registros

Publicado por Olga (5 intervenciones) el 05/01/2009 15:40:54
Muchas gracias si funciono y va bien rapido
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Encontrar huecos entre registros

Publicado por Brenda Loera (1 intervención) el 03/08/2009 17:44:09
Hola Todos
Aqui les dejo este codigo quye funciona para buscar los huecos..

alter procedure DBA.sp_buscarprovlibre

/* FUNCION : Encontrar los huecos disponibles en la tabla de Proveedores
CREACION : BLOERA 03-AGO-09
*/
as
begin
declare @MaxProv numeric
declare @Contador numeric
select @Contador=0
select @MaxProv = max(numpro) from sp_proveedores
create table #tblhuecosprov(
consec integer null,
comments varchar(20) null,
)
while(@Contador < @MaxProv)
begin
select @Contador=@Contador+1
insert into #tblhuecosprov values(
@Contador,'HUECO DISPONIBLE')
end
select consec,comments from #tblhuecosprov where
not consec = any(select numpro from sp_proveedores) order by
consec asc
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar