Descobrir Lacunas numa sequencia

29/09/2003

0

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


Responder

Post mais votado

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


Gatoledo

Gatoledo
Responder

Mais Posts

20/10/2003

Anderson_dpa

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


Responder

20/10/2003

Anderson_dpa

Depois é só dar um select na tabela Faltantes


Anderson...


Responder

20/08/2020

Alvaro Vieira




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





Responder

21/08/2020

Emerson Nascimento

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.

Responder

10/02/2023

Marnad Maia

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

to tentando resolver essa questao aqui de prova, envolvendo sql server
Responder

14/02/2023

Arthur Heinrich

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

Responder

14/02/2023

Emerson Nascimento

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
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar