none
Salto numérico - preciso de uma Query mas via Select para identificar o salto RRS feed

  • Pergunta

  • Pessoal bom dia!

    Preciso muito da ajuda de vocês

    Necessito de uma Query com Select para identificar um salto de numero

    Exemplo:

    1, 2, 3, 4, 6, 9, 10 ( nessa query retorne somente os números 5,  7 e 8 )

    Mas preciso que seja uma Query com Select (existe como ?) Via procedure eu já consegui, mas não posso utilizar na empresa, eles querem Select, vi vários exemplos mas nenhum chegou no resultado, sempre dá alguma diferença.

    Agradeço a ajuda da comunicade

    tks

    terça-feira, 13 de junho de 2017 14:35

Respostas

  • Fiz algumas mudanças e trouxe dois resultados 

    Code 1 para o Sql server 2012

    DECLARE @tabela TABLE ( numero INT );
    
    INSERT  INTO @tabela
            ( numero )
    VALUES  ( 1 ),
            ( 2 ),
            ( 3 ),
            ( 4 ),
            ( 6 ),
            ( 8 ),
            ( 9 ),
            ( 10 ),
            ( 15 );
    
    DECLARE @MenorNumero INT = ( SELECT MIN(T.numero)
                                 FROM   @tabela AS T
                               );
    DECLARE @MaiorNumero INT = ( SELECT MAX(T.numero)
                                 FROM   @tabela AS T
                               );
    
    WITH    Intervalo
              AS ( SELECT   @MenorNumero AS numero
                   UNION ALL
                   SELECT   T.numero + 1
                   FROM     Intervalo T
                   WHERE    T.numero < @MaiorNumero
                 ),
    DadosResultado2012 AS (
     SELECT   T.numero ,
                            [Proximo] =  TA.numero 
                   FROM     Intervalo AS T
    			   LEFT JOIN @tabela AS TA ON TA.numero = T.numero +1
    )
    
    
        SELECT  r.numero ,
                r.Proximo,
    			[Registro Salto] = IIF(r.numero +1 = r.Proximo,'','Salto'),
    			[Faltante] = IIF(r.numero +1 = r.Proximo,NULL,r.numero +1)
        FROM    DadosResultado2012 r

    Code 2 para o Sql server 2008

    DECLARE @tabela TABLE ( numero INT );
    
    INSERT  INTO @tabela
            ( numero )
    VALUES  ( 1 ),
            ( 2 ),
            ( 3 ),
            ( 4 ),
            ( 6 ),
            ( 8 ),
            ( 9 ),
            ( 10 ),
            ( 15 );
    
    DECLARE @MenorNumero INT = ( SELECT MIN(T.numero)
                                 FROM   @tabela AS T
                               );
    DECLARE @MaiorNumero INT = ( SELECT MAX(T.numero)
                                 FROM   @tabela AS T
                               );
    
    WITH    Intervalo
              AS ( SELECT   @MenorNumero AS numero
                   UNION ALL
                   SELECT   T.numero + 1
                   FROM     Intervalo T
                   WHERE    T.numero < @MaiorNumero
                 ),
    
            DadosResultado2008
              AS ( SELECT   T.numero ,
                            [Proximo] = TA.numero
                   FROM     Intervalo AS T
                            LEFT JOIN @tabela AS TA ON TA.numero = T.numero + 1
                 )
        SELECT  r.numero ,
                r.Proximo ,
                [Registro Salto] = CASE WHEN ( r.numero + 1 = r.Proximo ) THEN ''
                                        ELSE 'Salto'
                                   END ,
                [Faltante] = CASE WHEN ( r.numero + 1 = r.Proximo ) THEN NULL
                                  ELSE r.numero + 1
                             END
        FROM    DadosResultado2008 r;

    Wesley Neves
    Brasilia-DF
    MTA-SQL Server
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves

    terça-feira, 13 de junho de 2017 16:27

Todas as Respostas

  • Fiz dessa forma , vê se ajuda , testei no SQL Server 2012

    DECLARE @tabela TABLE ( numero INT );
    
    INSERT  INTO @tabela
            ( numero )
    VALUES  ( 1 ),
    		( 2 ),
            ( 3 ),
            ( 4 ),
            ( 6 ),
            ( 8 ),
            ( 10 );
    
    
    ;WITH    Dados
              AS ( SELECT   T.numero ,
                            [Proximo] = LEAD(T.numero) OVER(ORDER BY T.numero)
                   FROM     @tabela AS T
                 )
        SELECT  r.numero ,
                r.Proximo,
    			[Registro Salto] = IIF(r.numero +1 = r.Proximo,'','Salto'),	
    			[Faltante] = IIF(r.numero + 1 = r.Proximo,NULL,r.Proximo -1 )
        FROM    Dados r;

    Wesley Neves
    Brasilia-DF
    MTA-SQL Server
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"



    Wesley Neves

    terça-feira, 13 de junho de 2017 14:47
  • Deleted
    terça-feira, 13 de junho de 2017 15:02
  • Wesley bom dia!

    Muito obrigado pelo retorno

    Fiz um teste local no meu SQL 2012 e o retorno que espero é exatamente esse, mas o meu cliente utiliza o SQL 2008 ainda  :/  a função Lead não funciona, mas valew a dica !

    Se houver alguma outra forma de fazer e alguém puder ajudar agradeço muito!

    abs

    terça-feira, 13 de junho de 2017 15:03
  • Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (Intel X86) 
    Enterprise Edition on Windows NT 6.3 <X64> (Build 14393: ) (WOW64)
    terça-feira, 13 de junho de 2017 15:07
  • Fiz algumas mudanças e trouxe dois resultados 

    Code 1 para o Sql server 2012

    DECLARE @tabela TABLE ( numero INT );
    
    INSERT  INTO @tabela
            ( numero )
    VALUES  ( 1 ),
            ( 2 ),
            ( 3 ),
            ( 4 ),
            ( 6 ),
            ( 8 ),
            ( 9 ),
            ( 10 ),
            ( 15 );
    
    DECLARE @MenorNumero INT = ( SELECT MIN(T.numero)
                                 FROM   @tabela AS T
                               );
    DECLARE @MaiorNumero INT = ( SELECT MAX(T.numero)
                                 FROM   @tabela AS T
                               );
    
    WITH    Intervalo
              AS ( SELECT   @MenorNumero AS numero
                   UNION ALL
                   SELECT   T.numero + 1
                   FROM     Intervalo T
                   WHERE    T.numero < @MaiorNumero
                 ),
    DadosResultado2012 AS (
     SELECT   T.numero ,
                            [Proximo] =  TA.numero 
                   FROM     Intervalo AS T
    			   LEFT JOIN @tabela AS TA ON TA.numero = T.numero +1
    )
    
    
        SELECT  r.numero ,
                r.Proximo,
    			[Registro Salto] = IIF(r.numero +1 = r.Proximo,'','Salto'),
    			[Faltante] = IIF(r.numero +1 = r.Proximo,NULL,r.numero +1)
        FROM    DadosResultado2012 r

    Code 2 para o Sql server 2008

    DECLARE @tabela TABLE ( numero INT );
    
    INSERT  INTO @tabela
            ( numero )
    VALUES  ( 1 ),
            ( 2 ),
            ( 3 ),
            ( 4 ),
            ( 6 ),
            ( 8 ),
            ( 9 ),
            ( 10 ),
            ( 15 );
    
    DECLARE @MenorNumero INT = ( SELECT MIN(T.numero)
                                 FROM   @tabela AS T
                               );
    DECLARE @MaiorNumero INT = ( SELECT MAX(T.numero)
                                 FROM   @tabela AS T
                               );
    
    WITH    Intervalo
              AS ( SELECT   @MenorNumero AS numero
                   UNION ALL
                   SELECT   T.numero + 1
                   FROM     Intervalo T
                   WHERE    T.numero < @MaiorNumero
                 ),
    
            DadosResultado2008
              AS ( SELECT   T.numero ,
                            [Proximo] = TA.numero
                   FROM     Intervalo AS T
                            LEFT JOIN @tabela AS TA ON TA.numero = T.numero + 1
                 )
        SELECT  r.numero ,
                r.Proximo ,
                [Registro Salto] = CASE WHEN ( r.numero + 1 = r.Proximo ) THEN ''
                                        ELSE 'Salto'
                                   END ,
                [Faltante] = CASE WHEN ( r.numero + 1 = r.Proximo ) THEN NULL
                                  ELSE r.numero + 1
                             END
        FROM    DadosResultado2008 r;

    Wesley Neves
    Brasilia-DF
    MTA-SQL Server
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves

    terça-feira, 13 de junho de 2017 16:27
  • Wesley , Sensacional  !!!!

    Exatamente o que estava precisando, muito Obrigado pela ajuda !!!

    Agora vou adequar a minha necessidade.. .Valew !!!

    terça-feira, 13 de junho de 2017 16:47