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

    Calculo de Maior Intervalo

      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

              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

              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

                    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;