6 Replies Latest reply: May 25, 2016 3:14 PM by Mark Costa RSS

    Calculo de Maior Intervalo

    Tadeu Silva

      Boa tarde,

      como posso calcular o maior intervalo sem aparecer de cada número em uma tabela?

       

      O ID não conta como número, apenas N1, N2, N3.

       

      Exemplo:

      Tenho números de 1 a 5

       

      TABELA:

      ID , N1, N2, N3

      1, 2, 3, 5

      2, 4, 1, 5

      3, 1, 2, 3

      4, 2, 5, 4

      5, 2, 1, 5

      6, 2, 1, 4

      7, 3, 1, 5

      8, 4, 3, 5

      9, 2, 3, 4

       

      Número 1 - maior intervalo sem aparecer: 2

      Número 2 - maior intervalo sem aparecer: 2

      Número 3 - maior intervalo sem aparecer: 3

      Número 4 - maior intervalo sem aparecer: 1

      Número 5 - maior intervalo sem aparecer: 1

        • Re: Calculo de Maior Intervalo
          Alessandro Furtado

          Tadeu,

           

          eu não entendi o que você precisa.  Tem como explanar melhor?

            • Re: Calculo de Maior Intervalo
              Tadeu Silva

              Preciso mostrar a maior quantidade de linhas seguidas que um número fica sem aparecer.

               

              Por exemplo, o número 2 aparece na linha 6 e depois só aparece na linha 9. Logo não apareceu na linha 7 e 8. Ficou duas linhas seguidas sem aparecer. Se houvesse uma contagem maior que 2 linhas seguidas que ele não aparecesse aí seria mostrado a maior contagem.

            • Re: Calculo de Maior Intervalo
              Tadeu Silva

              Alguma sugestão pessoal?

              • Re: Calculo de Maior Intervalo
                Mark Costa

                Você pode tentar a solução abaixo:

                 

                TABELA:

                LOAD * INLINE [

                  ID , N1, N2, N3

                  1, 2, 3, 5

                  2, 4, 1, 5

                  3, 1, 2, 3

                  4, 2, 5, 4

                  5, 2, 1, 5

                  6, 2, 1, 4

                  7, 3, 1, 5

                  8, 4, 3, 5

                  9, 2, 3, 4

                ];

                 

                 

                TEMP_TABELA_AGREGADA:

                LOAD

                  ID,

                  N1 & N2 & N3 AS NUMEROS

                RESIDENT

                  TABELA

                ;

                 

                 

                NUMEROS_AVALIADOS:

                LOAD * INLINE [

                  VALOR

                  1

                  2

                  3

                  4

                  5

                ];

                 

                 

                 

                 

                FOR vNumerosAvaliadosIndex = 0 TO NOOFROWS('NUMEROS_AVALIADOS') - 1

                 

                 

                  LET vNumeroAvaliado = PEEK('VALOR',vNumerosAvaliadosIndex,'NUMEROS_AVALIADOS');

                 

                  SET vMaxInterval = 0;

                  SET vCurrentInterval = 0;

                 

                  FOR vIndex = 0 TO NOOFROWS('TEMP_TABELA_AGREGADA') - 1

                 

                  LET vNumero = PEEK('NUMEROS',vIndex,'TEMP_TABELA_AGREGADA');

                 

                  IF NOT WILDMATCH('$(vNumero)','*$(vNumeroAvaliado)*') THEN

                 

                  LET vCurrentInterval = $(vCurrentInterval) + 1;

                 

                  IF $(vCurrentInterval) > $(vMaxInterval) THEN

                 

                  LET vMaxInterval = $(vCurrentInterval);

                 

                  END IF

                 

                  ELSE

                 

                  SET vCurrentInterval = 0;

                 

                  END IF

                 

                  NEXT vIndex

                 

                 

                  MAX_INTERVALO:

                  LOAD

                  '$(vNumeroAvaliado)' AS NUMERO,

                  '$(vMaxInterval)' AS MAX_INTERVAL

                  AutoGenerate(1)

                  ;

                 

                 

                NEXT vNumerosAvaliadosIndex

                 

                 

                DROP TABLE TEMP_TABELA_AGREGADA;

                DROP TABLE NUMEROS_AVALIADOS;

                  • Re: Calculo de Maior Intervalo
                    Tadeu Silva

                    Seria isso mesmo Mark, porém, se coloco número com algarismos iguais, tipo, 11 ou 22 ou 33 etc, fica errado as contagens. Como ajustar isso?

                      • Re: Calculo de Maior Intervalo
                        Mark Costa

                        Nestes casos basta você adicionar um caractere delimitador para os números, no exemplo abaixo usei o |. Então as unidades númericas ficam separadas por blocos | numero |. Com isso em mente é só ajusar então o WildMatch. Note que você pode usar qualquer padrão númerico. Basta pra isso mudar como eles serão divididos e como serão encontrados pelo WildMatch. Segue o exemplo funcional:


                        TABELA:
                        LOAD * INLINE [
                        ID , N1, N2, N3
                        1, 2, 3, 5
                        2, 4, 1, 5
                        3, 1, 2, 3
                        4, 2, 5, 4
                        5, 2, 11, 5
                        6, 2, 1, 4
                        7, 3, 1, 5
                        8, 4, 3, 51
                        9, 2, 3, 4
                        ];

                        TEMP_TABELA_AGREGADA:
                        LOAD
                        ID,
                        '|' & N1 & '|' & N2 & '|' & N3 & '|'  AS NUMEROS
                        RESIDENT
                        TABELA
                        ;

                        NUMEROS_AVALIADOS:
                        LOAD * INLINE [
                        VALOR
                        1
                        2
                        3
                        4
                        5
                        11
                        51
                        ];

                        FOR vNumerosAvaliadosIndex = 0 TO NOOFROWS('NUMEROS_AVALIADOS') - 1

                        LET vNumeroAvaliado = PEEK('VALOR',vNumerosAvaliadosIndex,'NUMEROS_AVALIADOS');

                        SET vMaxInterval = 0;
                        SET vCurrentInterval = 0;

                        FOR vIndex = 0 TO NOOFROWS('TEMP_TABELA_AGREGADA') - 1

                          LET vNumero = PEEK('NUMEROS',vIndex,'TEMP_TABELA_AGREGADA');

                          IF NOT WILDMATCH('$(vNumero)','*|$(vNumeroAvaliado)|*') THEN
                         
                           LET vCurrentInterval = $(vCurrentInterval) + 1;
                          
                           IF $(vCurrentInterval) > $(vMaxInterval) THEN

                            LET vMaxInterval = $(vCurrentInterval); 

                           END IF
                         
                          ELSE
                         
                           SET vCurrentInterval = 0;
                           
                          END IF

                        NEXT vIndex

                        MAX_INTERVALO:
                        LOAD
                          '$(vNumeroAvaliado)' AS NUMERO,
                          '$(vMaxInterval)' AS MAX_INTERVAL
                          AutoGenerate(1)
                        ;

                        NEXT vNumerosAvaliadosIndex

                        DROP TABLE TEMP_TABELA_AGREGADA;
                        DROP TABLE NUMEROS_AVALIADOS;