Qlik Community

Ask a Question

Brasil

Announcements
QlikWorld Online 2021, May 10-12: Our Free, Virtual, Global Event REGISTER TODAY
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

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

1 Solution

Accepted Solutions
mark_costa
Partner
Partner

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;

View solution in original post

6 Replies
afurtado
MVP & Luminary
MVP & Luminary

Tadeu,

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

furtado@farolbi.com.br
Not applicable
Author

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.

Not applicable
Author

Alguma sugestão pessoal?

mark_costa
Partner
Partner

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;

View solution in original post

Not applicable
Author

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?

mark_costa
Partner
Partner

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;