Qlik Community

New to QlikView

Discussion board where members can get started with QlikView.

Announcements
Modernize Your QlikView Deployment webinar, Nov. 3rd. REGISTER
cancel
Showing results for 
Search instead for 
Did you mean: 
Highlighted
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
Highlighted
Creator II
Creator II

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
Highlighted
Creator II
Creator II

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;

 

Highlighted
Contributor II
Contributor II

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.

Highlighted
Creator II
Creator II

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

Highlighted
Contributor II
Contributor II

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!