Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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
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;
Tadeu,
eu não entendi o que você precisa. Tem como explanar melhor?
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.
Alguma sugestão pessoal?
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;
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?
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;