Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
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
marksouzacosta
Partner - Creator II
Partner - Creator II

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;

Get hooked on Qlik at qlikbait.net

View solution in original post

6 Replies
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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?

marksouzacosta
Partner - Creator II
Partner - Creator II

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;

Get hooked on Qlik at qlikbait.net
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?

marksouzacosta
Partner - Creator II
Partner - Creator II

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;

Get hooked on Qlik at qlikbait.net