Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
cesaraugperalta10
Contributor II
Contributor II

Identificando as 10 primeiras iterações realizadas por determinado usuário

Precisava identificar as 10 primeiras iterações realizadas por determinado usuário.

Estamos efetuando esse processo em 3 passos

  • Ordenação por usuário e data de iteração;
  • Criação de um índice sequencial novamente por usuário e data de iteração;
  • Leitura dos índices de 1 a 10.

Como a tabela contém mais de 100 milhões de registros, na hora de realizar a ordenação e o índice sequencial, a tabela fica por mais de 48 horas sem finalizar o processo.

Alguém sabe uma maneira de otimizar essa situação?

Segue um resumo do script realizado.

[Tabela 1]:
LOAD *
FROM e:/metricas.qvd(qvd);

//Ordenando e Criando índice
[Tabela 2]:
Load usu_codigo,
     data,

     acao,
     AutoNumber(RowNo(), usu_codigo) as indice_usuario
Resident [Tabela 1]
Order By usu_codigo, data;


//Selecionando as 10 primeiras interações
[Tabela 3]:
Load usu_codigo,
     data,

     acao,
     indice_usuario
Resident [Tabela 2]
Where indice_usuario <= 10;

Drop Table [Tabela 2];

Labels (2)
1 Solution

Accepted Solutions
JGMDataAnalysis
Creator III
Creator III

Algo como isto?

Temp_1:
NOCONCATENATE
LOAD * FROM e:/metricas.qvd(qvd);

Temp_2:
NOCONCATENATE
LOAD
    usu_codigo,
    data,
    acao,
    If(Peek(usu_codigo) = usu_codigo, Peek(row_no_user) + 1, 1) AS row_no_user
RESIDENT Temp_1
ORDER BY usu_codigo, data;

DROP TABLE Temp_1;

Test:
NOCONCATENATE
LOAD * RESIDENT Temp_2
WHERE row_no_user <= 10;

DROP TABLE Temp_2;
DROP FIELD row_no_user FROM Test;

 

View solution in original post

4 Replies
JGMDataAnalysis
Creator III
Creator III

Eu não entendo muito bem o que você está tentando fazer...

Você usa o campo [indice_usuario] apenas para filtrar a tabela?

A tabela Test  é equivalente a Tabela 3.

Temp: NOCONCATENATE LOAD * FROM e:/metricas.qvd(qvd);

Test:
FIRST 10 LOAD usu_codigo, data, acao
RESIDENT Temp
ORDER BY usu_codigo, data;

DROP TABLE Temp;

 

cesaraugperalta10
Contributor II
Contributor II
Author

Muito obrigado pela ajuda, mas ainda não é o que eu preciso.

Eu preciso das 10 primeiras iterações de cada usuário. 

Nessa situação proposta são apresentadas as 10 primeiras alterações no geral.

JGMDataAnalysis
Creator III
Creator III

Algo como isto?

Temp_1:
NOCONCATENATE
LOAD * FROM e:/metricas.qvd(qvd);

Temp_2:
NOCONCATENATE
LOAD
    usu_codigo,
    data,
    acao,
    If(Peek(usu_codigo) = usu_codigo, Peek(row_no_user) + 1, 1) AS row_no_user
RESIDENT Temp_1
ORDER BY usu_codigo, data;

DROP TABLE Temp_1;

Test:
NOCONCATENATE
LOAD * RESIDENT Temp_2
WHERE row_no_user <= 10;

DROP TABLE Temp_2;
DROP FIELD row_no_user FROM Test;

 

cesaraugperalta10
Contributor II
Contributor II
Author

Ficou ótimo! Acredito que a função Peek() tenha facilitado o processo de leitura e comparação.

O processo completo funcionou em 30 min. Muito obrigado!