Descobrir Lacunas numa sequencia
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
Alguém poderia me ajudar para conseguir a relação das lacunas existentes num intervalo de registro?
Muito Obrigada
Dps
Curtidas 0
Melhor post
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
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
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
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
29/09/2003
Depois é só dar um select na tabela Faltantes
Anderson...
Anderson...
GOSTEI 0
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
29/09/2003
não é preciso criar explicitamente uma tabela temporária.
utilize o recurso CTE (common table expression).
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.
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
29/09/2003
@anderson, por favor, pode me ajudar bit.ly/3RVQBsT
to tentando resolver essa questao aqui de prova, envolvendo sql server
to tentando resolver essa questao aqui de prova, envolvendo sql server
GOSTEI 0
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
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