Descobrir Lacunas numa sequencia

SQL Server

29/09/2003

Tenho uma tabela que um dos campos chamado numero segue uma sequencia de 1 à 75000, quero saber se ele não tem nenhum buraco (lacuna entre um número e outro), vale ressaltar que para cada numero existem vários iguais, precisando portanto de usar o distinct. A única forma que consegui pesquisar foi relacionando o número posterior e o anterior, isso num universo de 10000 fica muito difícil de ser visualizado.
Alguém poderia me ajudar para conseguir a relação das lacunas existentes num intervalo de registro?
Muito Obrigada


Dps

Dps

Curtidas 0

Melhor post

Gatoledo

Gatoledo

03/03/2004

Olá,

A idéia do Anderson é muito boa e funcional mas aí vai uma outra idéia.

1. Crie uma tabela temporária e faça o Insert dos valores de 1 até 75000.

2. Para localizar as lacunas faça:

select * from TEMP a
where not exists (select distinct chave from suatab b where a.chave=b.chave)


Fica a seu critério selecionar a forma mais rápida de implementar.


Gabriel


GOSTEI 1

Mais Respostas

Anderson_dpa

Anderson_dpa

29/09/2003

1º Criar uma tabela para inserir os números faltantes
Create table faltantes(Numero integer)


2º Executar o seguinte Script no Query Analiser

declare @registros integer
set @registros=1

while @Registro <= 75000
begin
If not Exists(Select numero from suatab where numero=@registros)
Begin
INSERT INTO FALTANTES(@REGISTROS)
Commit Tran
End
set @Registros=@Registros +1
end


Grande abraço e boa sorte

Anderson...
andersondpa@hotmail.com


GOSTEI 0
Anderson_dpa

Anderson_dpa

29/09/2003

Depois é só dar um select na tabela Faltantes


Anderson...


GOSTEI 0
Alvaro Vieira

Alvaro Vieira

29/09/2003




fiz uma pequena mudança na sugestão do Anderson:

SET NOCOUNT ON
--Assim você não precisa da tabela física no banco
DECLARE @FALTANTES TABLE (NUMERO INTEGER)

declare @registros integer
set @registros=1

while @registros <= 75000
begin
If not Exists(Select numero from suatab where numero=@registros)
Begin
INSERT INTO @FALTANTES VALUES (@registros)
End
set @registros=@registros +1
end

SELECT *
FROM @FALTANTES





GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/09/2003

não é preciso criar explicitamente uma tabela temporária.
utilize o recurso CTE (common table expression).
WITH CTE (ID) AS (
	SELECT 1 ID -- aqui você indica o valor inicial dos dados temporários
	UNION ALL 
	SELECT C.ID+1 FROM CTE C -- aqui é o incremento
)
SELECT CTE.ID
FROM CTE
LEFT JOIN TUA_TABELA TT WITH(NOLOCK) ON TT.NUMERO = CTE.ID -- aqui é feito o relacionamente da tabela CTE com a tua tabela
WHERE CTE.ID <= 75000 -- aqui você indica o número final a ser avaliado
AND TT.NUMERO IS NULL -- aqui está a a condição para exibição dos registros. no caso, quando o NUMERO estiver faltando na tua tabela
OPTION (MAXRECURSION 0)

use a opção WITH(NOLOCK) se NÃO quiser ficar esperando a finalização de transações que estiverem 'segurando' os registros da tua tabela.

GOSTEI 1
Marnad Maia

Marnad Maia

29/09/2003

@anderson, por favor, pode me ajudar bit.ly/3RVQBsT

to tentando resolver essa questao aqui de prova, envolvendo sql server
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

29/09/2003

Dá para utilizar funções analíticas:

  select
    codigo_ant, codigo
  from
    ( select
        lag(codigo) over(partition by 1 order by codigo) codigo_ant,
        codigo
      from tabela ) t
  where
    codigo-codigo_ant > 1

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/09/2003

seguindo o exemplo do Arthur Heinrich:
select
  'Falta(m) ' + cast(codigo-codigo_ant-1 as varchar(10)) + ' número(s) entre ' + cast(codigo_ant as varchar(10)) + ' e ' + cast(codigo as varchar(10)) ocorrencias
from
  ( select
      lag(codigo) over(partition by 1 order by codigo) codigo_ant,
      codigo
    from tabela ) t
where
  codigo-codigo_ant > 1
GOSTEI 0
POSTAR