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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar