Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bom dia,
Sou usuária nova no Qlik Sense, e preciso de uma ajuda urgente.
Preciso gerar um tabela, através de outra tabela já carregada.
Tenho os campos:
Nome ( indica o nome da pessoa), dia, dias de produção (onde 0 indica que a pessoa não trabalhou e 1 que trabalhou), e o grupo.
Na tabela que tenho que gerar, precisava fazer um loop para que todo vez que mudasse o nome ou o grupo ou quando a pessoa não trabalhasse ( que é indicado pelo número 0) ela pegasse a data de inicio e fim desse período.
Vou tentar exemplificar genericamente, pois são muitos os meus dados
Tenho uma tabela parecida com esta carregada:
Nome | Dia | Dias de Produção | Grupo |
João | 12/12/2017 | 1 | Grupo 1 |
João | 12/12/2017 | 0 | - |
João | 13/12/2017 | 1 | Grupo 1 |
João | 13/12/2017 | 1 | Grupo 1 |
João | 14/12/2017 | 1 | Grupo 2 |
Maria | 12/12/2017 | 0 | - |
Maria | 12/12/2017 | 1 | Grupo 1 |
Maria | 14/12/2017 | 1 | Grupo 1 |
Maria | 14/12/2017 | 1 | Grupo 2 |
Maria | 14/12/2017 | 0 | - |
Maria | 15/12/2017 | 1 | Grupo 1 |
Ana | 15/12/2017 | 1 | Grupo 1 |
Ana | 16/12/2017 | 1 | Grupo 1 |
Ana | 17/12/2017 | 0 | - |
Ana | 18/12/2017 | 1 | Grupo 2 |
E através dela precisava gerar uma igual esta:
Nome | Data Início | Data Fim | Grupo |
João | 12/12/2017 | 12/12/2017 | Grupo 1 |
João | 13/12/2047 | 13/12/2017 | Grupo 1 |
João | 14/12/2017 | 14/12/2017 | Grupo 2 |
Maria | 12/12/2017 | 14/12/2017 | Grupo 1 |
Maria | 14/12/2017 | 14/12/2017 | Grupo 2 |
Maria | 15/12/2017 | 15/12/2017 | Grupo 1 |
Ana | 15/12/2017 | 16/12/2017 | Grupo 1 |
Ana | 18/12/2017 | 18/12/2017 | Grupo 2 |
Já pesquisei, mas ainda não achei nada por completo que me ajudasse.
E estou precisando urgentemente, se alguém pudesse me ajudar ficaria muito grata.
Boa tarde Victória,
Veja se é assim que você precisa:
ORIGEM:
LOAD * Inline [
NOME,DATA,DIAS_PRODUCAO,GRUPO
João, 12/12/2017, 1, Grupo 1,
João, 12/12/2017, 0, ,
João, 13/12/2017, 1, Grupo 1,
João, 13/12/2017, 1, Grupo 1,
João, 14/12/2017, 1, Grupo 2,
Maria, 12/12/2017, 0, ,
Maria, 12/12/2017, 1, Grupo 1,
Maria, 14/12/2017, 1, Grupo 1,
Maria, 14/12/2017, 1, Grupo 2,
Maria, 14/12/2017, 0, ,
Maria, 15/12/2017, 1, Grupo 1,
Ana, 15/12/2017, 1, Grupo 1,
Ana, 16/12/2017, 1, Grupo 1,
Ana, 17/12/2017, 0, ,
Ana, 18/12/2017, 1, Grupo 2
];
FINAL:
LOAD
IF(DIAS_PRODUCAO=0,Previous(GRUPO),GRUPO) AS GRUPO
RESIDENT ORIGEM;
LEFT JOIN(FINAL)
LOAD
DATE(MAX(DATA)) AS DATA_FIM,
DATE(MIN(DATA)) AS DATA_INICIO,
NOME,
GRUPO
RESIDENT ORIGEM GROUP BY NOME,GRUPO;
DROP TABLE ORIGEM;
Victória,
Não deixe de marcar como resposta correta se isso te ajudou.
Abraços e sucesso!!
Thiago
Thiago,
Testei o Scrip aqui e ele quase deu certo.
Poderia me explicar exatamente o que faz esse seu scrip. Estou começando a usar o Qlik agora, então estou bem no início.
Ele está retornando a data de início e fim literalmente de todos os grupos.
Por exemplo, se alguém não trabalhou em algum dia em um determinado grupo, mas no dia seguinte voltou a trabalhar no mesmo grupo, teria que haver uma pausa ai. Como se cada vez que aparecesse um 0, também fosse um determinante para anotar a data de Início e Fim para aquele nome e aquele grupo.
Além disso, existe outra variável que também deve ser considerada d mesmo jeito, que é o porte (P,M,G) e caso mude o porte também, deve ser anotado a Data de Início e Fim, esse porte deve ser adicionado a minha nova tabela.
Saberia me ajudar novamente?
Muito obrigada pela ajuda!
Ola...Eu ja ajudei alguem com caso semelhante entao que voce consegue ajustar e usar
Ola Thiago,
Não consegui abrir seu scrip nesse post.
Será que poderia me enviar?
Estou precisando resolver esse problema urgentemente.
Obrigada pela ajuda!
Segue :
acho que isso deve te ajudar se voce precisa colocar mias parametros para definir voce so precisa adicionar no Load do MIn e do max e no order by o trque esta no Order By
se quiser as folgas junto, eu aconselho 2 coisas:
repetir esse codigo com Dias producao = 0
Ou que acho melhor , colocar o dias de producao no Load e no Order by e claro no load da tabela modelada
/************************************************************************/
//
/************************************************************************/
// 1 - Faco a leitura da Base Nao modelada
/************************************************************************/
Base_Modelada:
LOAD * INLINE [
Nome, Dia, Dias de Produção, Grupo
João, 12/12/2017, 1, Grupo 1
João, 12/12/2017, 0, -
João, 13/12/2017, 1, Grupo 1
João, 13/12/2017, 1, Grupo 1
João, 14/12/2017, 1, Grupo 2
Maria, 12/12/2017, 0, -
Maria, 12/12/2017, 1, Grupo 1
Maria, 14/12/2017, 1, Grupo 1
Maria, 14/12/2017, 1, Grupo 2
Maria, 14/12/2017, 0, -
Maria, 15/12/2017, 1, Grupo 1
Ana, 15/12/2017, 1, Grupo 1
Ana, 16/12/2017, 1, Grupo 1
Ana, 17/12/2017, 0, -
Ana, 18/12/2017, 1, Grupo 2
];
/************************************************************************/
// 2 - Descobrir qual e o menor Data por grupo por pessoa
//
/************************************************************************/
Min_Data_Por_status:
LOAD
Min(Dia) as MinDtSituacaoPerDay,
Grupo,
Nome
Resident Base_Modelada
Where [Dias de Produção] = 1
Group By
Grupo,
Nome
;
/************************************************************************/
// 3 - Descobrir qual e o maior horario por Equipamento
// e e por Status
/************************************************************************/
Max_Data_Por_status:
LOAD
Max(Dia) as MaxDtSituacaoPerDay,
Grupo,
Nome
Resident Base_Modelada
Where [Dias de Produção] = 1
Group By
Grupo,
Nome
;
/************************************************************************/
// 4 - Crio uma tabela somente com Status e ATM para fazer
// a modelagem final
/************************************************************************/
BaseModeladaFinal:
NoConcatenate
LOAD Distinct
Nome,
Grupo
Resident Base_Modelada
;
DROP Table Base_Modelada;
/************************************************************************/
// 5 - Faco o Join para tabela somente na tabela com status
// assim trago o menor para a tabela final
/************************************************************************/
Left Join (BaseModeladaFinal)
LOAD
Nome,
Grupo,
MinDtSituacaoPerDay as DtInicialStatus
Resident Min_Data_Por_status;
DROP Table Min_Data_Por_status;
/************************************************************************/
// 6 - Faco o Join para tabela somente na tabela com status
// assim trago o maior para a tabela final
/************************************************************************/
Left Join(BaseModeladaFinal)
LOAD
Nome,
Grupo,
MaxDtSituacaoPerDay as DtFinalStatus
Resident Max_Data_Por_status
;
DROP Table Max_Data_Por_status;
1 - Faco a leitura da Base Nao modelada
Com as folgas ficaria assim
/************************************************************************/
// 1 - Faco a leitura da Base Nao modelada
/************************************************************************/
Base_Modelada:
LOAD * INLINE [
Nome, Dia, Dias de Produção, Grupo
João, 12/12/2017, 1, Grupo 1
João, 12/12/2017, 0, -
João, 13/12/2017, 1, Grupo 1
João, 13/12/2017, 1, Grupo 1
João, 14/12/2017, 1, Grupo 2
Maria, 12/12/2017, 0, -
Maria, 12/12/2017, 1, Grupo 1
Maria, 14/12/2017, 1, Grupo 1
Maria, 14/12/2017, 1, Grupo 2
Maria, 14/12/2017, 0, -
Maria, 15/12/2017, 1, Grupo 1
Ana, 15/12/2017, 1, Grupo 1
Ana, 16/12/2017, 1, Grupo 1
Ana, 17/12/2017, 0, -
Ana, 18/12/2017, 1, Grupo 2
];
/************************************************************************/
// 2 - Descobrir qual e o menor Data por grupo por pessoa
//
/************************************************************************/
Min_Data_Por_status:
LOAD
Min(Dia) as MinDtSituacaoPerDay,
Grupo,
Nome,
[Dias de Produção]
Resident Base_Modelada
Group By
Grupo,
Nome,
[Dias de Produção]
;
/************************************************************************/
// 3 - Descobrir qual e o maior horario por Equipamento
// e e por Status
/************************************************************************/
Max_Data_Por_status:
LOAD
Max(Dia) as MaxDtSituacaoPerDay,
Grupo,
Nome,
[Dias de Produção]
Resident Base_Modelada
Group By
Grupo,
Nome,
[Dias de Produção]
;
/************************************************************************/
// 4 - Crio uma tabela somente com Status e ATM para fazer
// a modelagem final
/************************************************************************/
BaseModeladaFinal:
NoConcatenate
LOAD Distinct
Nome,
Grupo
Resident Base_Modelada
;
DROP Table Base_Modelada;
/************************************************************************/
// 5 - Faco o Join para tabela somente na tabela com status
// assim trago o menor para a tabela final
/************************************************************************/
Left Join (BaseModeladaFinal)
LOAD
Nome,
Grupo,
[Dias de Produção],
MinDtSituacaoPerDay as DtInicialStatus
Resident Min_Data_Por_status;
DROP Table Min_Data_Por_status;
/************************************************************************/
// 6 - Faco o Join para tabela somente na tabela com status
// assim trago o maior para a tabela final
/************************************************************************/
Left Join(BaseModeladaFinal)
LOAD
Nome,
Grupo,
[Dias de Produção],
MaxDtSituacaoPerDay as DtFinalStatus
Resident Max_Data_Por_status
;
DROP Table Max_Data_Por_status;
Ajustado:
LOAD
*,
if( len(Grupo) < 2 , 'Folga','Trabalhado') as Status
Resident BaseModeladaFinal;
DROP Table BaseModeladaFinal;
Thiago,
Eu não entendi, onde no scrip ele vai estar diferenciando todas as vezes que mudar de grupo.
Meu scrip verdadeiro é esse:
[Geral]:
LOAD
%MagistradoID,
Dia,
date(Dia,'DD/MM/YYYY') AS DT,
"Dias Afastdo/Designado",
"Dias Produtividade (Acumulado)",
"Dias Produtividade";
FROM [Geral.qvd];
left Join
[Magistrados]:
LOAD
%MagistradoID,
"Matrícula (Magistrado)",
"Sexo (Magistrado)",
Magistrado
FROM [Magistrados.qvd]
(qvd);
left Join
[Magistrado-Orgao]:
LOAD
%MagistradoID,
Dia,
"%Órgão JulgadorID",
%FunçãoID
FROM Magistrado-Orgao.qvd]
(qvd);
left Join
[Orgao-Julgadores]:
LOAD
"%Órgão JulgadorID",
Instância,
Entrância,
"Região da Corregedoria",
Comarca,
"Órgão Julgador",
"Tipo de Justiça",
"Especialidade (Órgão Julgador)",
"Natureza (Órgão Julgador)",
Cluster,
Porte,
"Data de Início da Vigência",
"Data de Fim da Vigência"
FROM [Orgaos-Julgadores.qvd]
(qvd);
E eu Preciso no Final uma tabela que me fale o Magistrado, Data de ínico e dia de Fim de trabalho, no Cluster e por Porte. Isso para todos os dias de trabalho, que são os dias de produtividade igual a 1. E caso haja uma folga no período, tem que ser interrompido. Como se começasse a contar de novo.
Ou seja, toda vez que mudar o Magistrado, ou o Cluster ou o Porte, ou fosse um dia de folga, teria que ser a data fim. Mesmo que fosse o mesmo Magistrado.
Conseguiu entender mais ou menos.
Como sou nova no qlik sense, ainda é um bastante complexo para mim.
Vou tentar ajustar seu scip.
Muito Obrigada!
entao eu uso na verdade o Meu Max e min por dia, ele agrupado por Grupo vai pegar sempre
Menor data + Grupo
se a pessoa muda de grupo vou pegar sisso, voce noa consegue me passa uma amostra de dados mais real ? com tudo, para que eu possa monta pra ti melhor o codigo, pq teoricamente depois de fazer toda essa uniao ai aplicaria meu script e calcularia , noa precisa ser muito registro so umas 10 a 15 linhas eu consigo fazer aqui rapidim