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.
Bom tardei
mas acho que agora foi....
Basicamente e o mesmo script com algumas melhoras no final
Minha logica:
O problema esta que ele pelo flag de dias trabalhados esta fazendo o que deveria o que eu precisa fazer a descobrir qual e o registro que esta errado ( porque tem o dia trabalho, depois vem a folga, logo se eu descobrir qual e o registro da folga, eu consigo acha o registro que a data deve ser alterar , que seria no caso o antecessor ao registro da folga), sempre que for o mesmo grupo, mesmo porte e a data final do registro a cima for maior que atual (porque noa faz sentindo, porque eu ordei por data) significa que esse registro a cima precisa ser alterado.
Obs Importante: Meu calendario daqui e de Segunda a Sexta (estou fora do brasil, por isso e calendario diferente no brasil e domingo a sexta), entao no if troca para 7 e 1
/************************************************************************/
// 1 - Faco a leitura da Base Nao modelada
/************************************************************************/
Base_Modelada:
LOAD * INLINE [
Nome , Dia , Dias Produtividade , Grupo , Porte
Maria , 29/08/2016 , 1 , Grupo 1 , M
Maria , 30/08/2016 , 1 , Grupo 1 , M
Maria , 31/01/2017 , 1 , Grupo 1 , M
Maria , 31/01/2017 , 1 , Grupo 2 , M
Maria , 02/02/2017 , 1 , Grupo 3 , P
Maria , 03/03/2017 , 1 , Grupo 3 , P
Maria , 04/03/2017 , 0 , Grupo 3 , P
Maria , 05/03/2017 , 1 , Grupo 3 , P
Maria , 05/03/2017 , 1 , Grupo 3 , G
Maria , 06/03/2017 , 1 , Grupo 3 , G
João , 07/03/2017 , 1 , Grupo 3 , G
João , 08/03/2017 , 0 , Grupo 4 , G
João , 09/03/2017 , 1 , Grupo 3 , G
João , 09/03/2017 , 1 , Grupo 3 , M
];
/************************************************************************/
// 2 - Descobrir qual e o menor Data por grupo por pessoa
//
/************************************************************************/
Min_Data_Por_status:
LOAD
Min(Dia) as MinDtSituacaoPerDay,
Grupo,
Nome,
Porte,
[Dias Produtividade]
Resident Base_Modelada
Group By
Grupo,
Nome,
Porte,
[Dias Produtividade]
;
/************************************************************************/
// 3 - Descobrir qual e o maior horario por Equipamento
// e e por Status
/************************************************************************/
Max_Data_Por_status:
LOAD
Max(Dia) as MaxDtSituacaoPerDay,
Grupo,
Nome,
Porte,
[Dias Produtividade]
Resident Base_Modelada
Group By
Grupo,
Nome,
Porte,
[Dias Produtividade]
;
/************************************************************************/
// 4 - Crio uma tabela somente com Status e ATM para fazer
// a modelagem final
/************************************************************************/
BaseModeladaFinal:
NoConcatenate
LOAD Distinct
Nome,
Grupo,
Porte
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
Grupo,
Nome,
Porte,
MinDtSituacaoPerDay as DtInicialStatus,
[Dias Produtividade]
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
Grupo,
Nome,
Porte,
MaxDtSituacaoPerDay as DtFinalStatus,
[Dias Produtividade]
Resident Max_Data_Por_status
;
DROP Table Max_Data_Por_status;
/**************************************************************/
//Descobrindo o registro que esta com problema e arruma
/**************************************************************/
Ajustado:
NoConcatenate
LOAD Distinct
RowNo() as Seq,
*,
if(Previous(Grupo) = Grupo and
Previous(Porte) = Porte and
Previous(DtFinalStatus) > DtFinalStatus , 1 ,0) as [Flag Divergencia Data],
if(Previous(Grupo) = Grupo and
Previous(Porte) = Porte and
Previous(DtFinalStatus) > DtFinalStatus , Num(DtFinalStatus)-1, Null()) as [Data Final Corrigida],
if( [Dias Produtividade] = 0 , 'Folga','Trabalhado') as Status
Resident BaseModeladaFinal
order by DtInicialStatus , Nome, Grupo , Porte;
DROP Table BaseModeladaFinal;
/**********************************************************************/
//Mapping Cara corrigidr a data
/**********************************************************************/
//Obs: o If aqui e para garantir que sempre vai jogar para sexta feira, tire se achar necessario.
MappingCorrecao:
mapping
LOAD
Previous(Seq) as SeqCorrigido,
if(Num(WeekDay([Data Final Corrigida])) = 7 , [Data Final Corrigida] -1,
if(Num(WeekDay([Data Final Corrigida])) = 1 ,[Data Final Corrigida]-2, [Data Final Corrigida] )
) as [Data Final Corrigida]
Resident Ajustado
Where [Flag Divergencia Data] = 1
;
DROP Field [Flag Divergencia Data], [Data Final Corrigida] from Ajustado;
/***********************************************/
//Base Final
/***********************************************/
BaseConsolidada:
NoConcatenate
LOAD
Grupo,
Nome,
Porte,
DtInicialStatus,
[Dias Produtividade],
Status,
ApplyMap('MappingCorrecao',Seq,DtFinalStatus) as DtFinalStatus
Resident Ajustado
;
DROP Table Ajustado;
fica assim:
Nome | Dias Produtividade | Grupo | Porte | DtInicialStatus | DtFinalStatus | Status |
---|---|---|---|---|---|---|
Maria | 1 | Grupo 1 | M | 29/08/2016 | 31/01/2017 | Trabalhado |
Maria | 1 | Grupo 2 | M | 31/01/2017 | 31/01/2017 | Trabalhado |
Maria | 1 | Grupo 3 | P | 02/02/2017 | 03/03/2017 | Trabalhado |
Maria | 0 | Grupo 3 | P | 04/03/2017 | 04/03/2017 | Folga |
Maria | 1 | Grupo 3 | G | 05/03/2017 | 06/03/2017 | Trabalhado |
Thiago,
Entendi o que você fez, ainda não rodei o meu scrip mas pela sua tabela final, ainda sim, falta o dia 05/03/2017 trabalhado da Maria no grupo 3 no Porte P.
Pelo que estou visualizando pulou para o Grupo 3 Porte G, Que a Maria também trabalhou no dia 05/03/2017.
Certo?
Tem como ajustar o script?
Eu não entendi essa parte de mudar para 7 e 1 o IF, já não esta com 7 e 1?
Talvez não seria 0 e 6?
Não entendi essa parte!
Entendi.
Sim seria 0 e 6 ...desculpe, voce vai ver que tem um IF para verificar se final de semana para jogar na sexta no Mapping. Nesse cara altera para 0 e 6
Ela trabalhou nos dois Portes?Nao tinha percebido isso, desculpe.
Porque na verdade onde estava Dia 05/03 foi transformado em 3.
Vai ficar para P sera 05/03 a 05/03 e G 05/03 ate 06/03 , mas e isso mesmo ?
Se for faz o seguinte:
remove isso do codigo:
DROP Field [Flag Divergencia Data], [Data Final Corrigida] from Ajustado;
E adiciona isso depois da Tabela "BaseConsolidada"
/***********************************************/
// Ajuste: Quando a pessoa trabalha em dois Porte no mesmo dia Ajustaremos os dados
//Obs: Colocarei que a pessoa entrou e saiu no mesmo dia, porque ela pode ter finalizado em outro porte.
/***********************************************/
Concatenate
LOAD
Previous(Grupo) as Grupo,
Previous(Nome) as Nome,
Previous(Porte) as Porte,
Previous(DtFinalStatus) as DtFinalStatus,
Previous(DtFinalStatus) as DtInicialStatus,
Previous([Dias Produtividade]) as [Dias Produtividade] ,
Previous(Status) as Status
Resident Ajustado
Where
[Flag Divergencia Data] = 1;
DROP Table Ajustado;
Teoricamente fica assim
Nome | Dias Produtividade | Grupo | Porte | DtInicialStatus | DtFinalStatus | Status |
---|---|---|---|---|---|---|
Maria | 1 | Grupo 1 | M | 29/08/2016 | 31/01/2017 | Trabalhado |
Maria | 1 | Grupo 2 | M | 31/01/2017 | 31/01/2017 | Trabalhado |
Maria | 1 | Grupo 3 | P | 02/02/2017 | 03/03/2017 | Trabalhado |
Maria | 0 | Grupo 3 | P | 04/03/2017 | 04/03/2017 | Folga |
Maria | 1 | Grupo 3 | P | 05/03/2017 | 05/03/2017 | Trabalhado |
Maria | 1 | Grupo 3 | G | 05/03/2017 | 06/03/2017 | Trabalhado |
Oi Thiago,
Rodei o esse script, que é um "genérico". Pois a minha base de dados é enorme e deu certinho o resultado da Maria.
Mas quando vou analisar o João, ainda encontro erro.
A tabela carregada é essa:
Encontrei o seguinte resultado:
Nome | DtInicialStatus | DtFinalStatus | Grupo | Porte | Status |
Maria | 29/08/2016 | 31/01/2017 | Grupo 1 | M | Trabalhado |
Maria | 31/01/2017 | 31/01/2017 | Grupo 2 | M | Trabalhado |
Maria | 02/02/2017 | 03/03/2017 | Grupo 3 | P | Trabalhado |
Maria | 04/03/2017 | 04/03/2017 | Grupo 3 | P | Folga |
Maria | 05/03/2017 | 05/03/2017 | Grupo 3 | P | Trabalhado |
Maria | 05/03/2017 | 06/03/2017 | Grupo 3 | G | Trabalhado |
João | 07/03/2017 | 09/03/2017 | Grupo 3 | G | Trabalhado |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | M | Trabalhado |
João | 08/03/2017 | 08/03/2017 | Grupo 4 | G | Folga |
O resultado do João continua errado. Como se ele estivesse desconsiderando a folga apesar de está registrando ela como sendo no dia 08/03 no Grupo 4 G. Mas em dias trabalhados ele ainda continua considerando do dia 07/03/2017 a 09/07/2017, quando tinha que ser considerado trabalhado no grupo 3 G na verdade:
07/03/2017 a 07/03/2017 e depois 09/03/2017 a 09/03/2017..
Acho que entendi a lógico que o Qlik fez. Como a folga está no grupo 4 G, é como se nada tivesse acontecido no grupo 3 G e ele tivesse trabalhando.
Mas acontece que como ele teve a folga e não tem dia trabalhado no dia 08/03/2017 no Grupo 3 G, provavelmente ele não veio trabalhar. Ou seja, sempre que houver uma folga independente do grupo que estiver alocada esta folga, caso não haja registro de dia trabalhado em outro grupo para esse dia de folga, é como se tivesse tido folga para todos os grupos, entende ?
Como no caso do João descrito acima. Ou seja, filtrando somente os dias trabalhados teriam que ficar assim:
Nome | Dia Inicio | Dia Fim | Grupo | Porte |
Maria | 29/08/2016 | 31/01/2017 | Grupo 1 | M |
Maria | 31/01/2017 | 31/01/2017 | Grupo 2 | M |
Maria | 02/02/2017 | 03/03/2017 | Grupo 3 | P |
Maria | 05/03/2017 | 05/03/2017 | Grupo 3 | P |
Maria | 05/03/2017 | 06/03/2017 | Grupo 3 | G |
João | 07/03/2017 | 07/03/2017 | Grupo 3 | G |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | G |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | M |
Teria como acrescentar isso no código?
Ola
Isso ta ficando interessante, rs
Entendi
So altera esse trecho do codigo :
para atender essa regra mudei a forma de verificar o registro, entao so irei se o Nome do registro Atual for = o Registro anterior
e a Data Final Status for > que Data Final Status
Ficou mais simples ate porque, nao faz sentindo se eu ordei pela data inicial que existe alguma data Final na como registro anterior superior a atual.
Achava que a Gupo e Porte eram chaves forte, mas entendi que nao sao, entao ta beleza so pelo Nome e Data.
Ajustado:
NoConcatenate
LOAD Distinct
RowNo() as Seq,
*,
if( Previous(Nome) = Nome and
Previous(DtFinalStatus) > DtFinalStatus , 1 ,
0) as [Flag Divergencia Data],
if( Previous(Nome) = Nome and
Previous(DtFinalStatus) > DtFinalStatus , Num(DtFinalStatus)-1, Null()) as [Data Final Corrigida],
if( [Dias Produtividade] = 0 , 'Folga','Trabalhado') as Status
Resident BaseModeladaFinal
order by DtInicialStatus , Nome, Grupo , Porte;
DROP Table BaseModeladaFinal;
Resultado
Nome | Dias Produtividade | Grupo | Porte | DtInicialStatus | DtFinalStatus | Status |
---|---|---|---|---|---|---|
Maria | 1 | Grupo 1 | M | 29/08/2016 | 31/01/2017 | Trabalhado |
Maria | 1 | Grupo 2 | M | 31/01/2017 | 31/01/2017 | Trabalhado |
Maria | 1 | Grupo 3 | P | 02/02/2017 | 03/03/2017 | Trabalhado |
Maria | 0 | Grupo 3 | P | 04/03/2017 | 04/03/2017 | Folga |
Maria | 1 | Grupo 3 | P | 05/03/2017 | 05/03/2017 | Trabalhado |
Maria | 1 | Grupo 3 | G | 05/03/2017 | 06/03/2017 | Trabalhado |
João | 1 | Grupo 3 | G | 07/03/2017 | 07/03/2017 | Trabalhado |
João | 0 | Grupo 4 | G | 08/03/2017 | 08/03/2017 | Folga |
João | 1 | Grupo 3 | G | 09/03/2017 | 09/03/2017 | Trabalhado |
João | 1 | Grupo 3 | M | 09/03/2017 | 09/03/2017 | Trabalhado |
Oi Thiago,
Isso é muito complexo. Se não fosse você já tinha desistido. rsrs
Consegui rodar. Deu direitinho. Muito Obrigada! Obrigada mesmo!
Mas quando fui Aplicar nos meus dados reais. O resultado não deu certo, parece que ainda sim está pulando o dia de folga e indo direto pro final.
Vou te passar meu script de verdade, assim você pode vê se tem algum erro. E eu vou te explicar o que na verdade eu tenho que fazer.
[Geral]:
LOAD
%MagistradoID,
Dia,
date(Dia,'DD/MM/YYYY') AS DT,
"Dias Afastdo/Designado",
"Dias Produtividade (Acumulado)",
"Dias Produtividade"
FROM [lib://DataFile - C]
(qvd);
Left Join
[Magistrados]:
LOAD
%MagistradoID,
"Matrícula (Magistrado)",
"Sexo (Magistrado)",
Magistrado
FROM [lib://DataFile - C]
(qvd);
Left Join
[Magistrado_Orgao]:
LOAD
%MagistradoID,
Dia,
"%Órgão JulgadorID",
%FunçãoID
FROM [lib://DataFile - C]
(qvd);
left Join
[Orgaos 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 [lib://DataFile- C]
(qvd);
/************************************************************************/
// 2 - Descobrir qual e o menor Data por grupo por pessoa
//
/************************************************************************/
[Min_Data]:
LOAD
Min(DT) as MinDtSituacaoPerDay,
Cluster,
Magistrado,
[Dias Produtividade],
Porte
Resident Geral
Group By
Cluster,
Magistrado,
[Dias Produtividade],
Porte
;
/************************************************************************/
// 3 - Descobrir qual e o maior horario por Equipamento
// e e por Status
/************************************************************************/
[Max_Data]:
LOAD
Max(DT) as MaxDtSituacaoPerDay,
Cluster,
Magistrado,
[Dias Produtividade],
Porte
Resident Geral
Group By
Cluster,
Magistrado,
[Dias Produtividade],
Porte
;
/************************************************************************/
// 4 - Crio uma tabela somente com Status e ATM para fazer
// a modelagem final
/************************************************************************/
BaseModeladaFinal:
NoConcatenate
LOAD Distinct
Magistrado,
Cluster,
Porte
Resident Geral
;
DROP Table Geral;
/************************************************************************/
// 5 - Faco o Join para tabela somente na tabela com status
// assim trago o menor para a tabela final
/************************************************************************/
Left Join (BaseModeladaFinal)
LOAD
Cluster,
Magistrado,
[Dias Produtividade],
Porte,
date(MinDtSituacaoPerDay,'DD/MM/YYYY') as DtInicialStatus
Resident Min_Data;
DROP Table Min_Data;
/************************************************************************/
// 6 - Faco o Join para tabela somente na tabela com status
// assim trago o maior para a tabela final
/************************************************************************/
Left Join(BaseModeladaFinal)
LOAD
Cluster,
Magistrado,
[Dias Produtividade],
Porte,
date(MaxDtSituacaoPerDay,'DD/MM/YYYY') as DtFinalStatus
Resident Max_Data
;
DROP Table Max_Data;
[Ajustado]:
NoConcatenate
LOAD Distinct
RowNo() as Seq,
*,
if( Previous(Magistrado) = Magistrado and
Previous(DtFinalStatus) > DtFinalStatus , 1 ,
0) as [Flag Divergencia Data],
if( Previous(Magistrado) = Magistrado and
Previous(DtFinalStatus) > DtFinalStatus , Num(DtFinalStatus)-1, Null()) as [Data Final Corrigida],
if( [Dias Produtividade] = 0 , 'Folga','Trabalhado') as Status
Resident BaseModeladaFinal
order by DtInicialStatus , Magistrado, Cluster , Porte;
DROP Table BaseModeladaFinal;
/**********************************************************************/
//Mapping Cara corrigidr a data
/**********************************************************************/
//Obs: o If aqui e para garantir que sempre vai jogar para sexta feira, tire se achar necessario.
MappingCorrecao:
mapping
LOAD
Previous(Seq) as SeqCorrigido,
if(Num(WeekDay([Data Final Corrigida])) = 0 , [Data Final Corrigida] -1,
if(Num(WeekDay([Data Final Corrigida])) = 6 ,[Data Final Corrigida]-2, [Data Final Corrigida] )
) as [Data Final Corrigida]
Resident Ajustado
Where [Flag Divergencia Data] = 1
;
/***********************************************/
//Base Final
/***********************************************/
BaseConsolidada:
NoConcatenate
LOAD
Cluster,
Magistrado,
Porte,
DtInicialStatus,
[Dias Produtividade],
Status,
ApplyMap('MappingCorrecao',Seq,DtFinalStatus) as DtFinalStatus
Resident Ajustado
;
//
/***********************************************/
// Ajuste: Quando a pessoa trabalha em dois Porte no mesmo dia Ajustaremos os dados
//Obs: Colocarei que a pessoa entrou e saiu no mesmo dia, porque ela pode ter finalizado em outro porte.
/***********************************************/
Concatenate
LOAD
Previous(Cluster) as Cluster,
Previous(Magistrado) as Magistrado,
Previous(Porte) as Porte,
Previous(DtFinalStatus) as DtFinalStatus,
Previous(DtFinalStatus) as DtInicialStatus,
Previous([Dias Produtividade]) as [Dias Produtividade] ,
Previous(Status) as Status
Resident Ajustado
Where
[Flag Divergencia Data] = 1;
DROP Table Ajustado;
Comparando com o exemplo do João e Maria é como se a variável nome correspondesse a varável magistrado e a variável grupo a variável cluster nos meus dados reais.
Então eu preciso montar a tabela com Nome do Magistrado, data início, data fim, cluster e porte, sendo que a cada vez que muda o porte ou o grupo, ou o magistrado ou se trabalha ou não ( que é o dias de produtividade igual a 0 quando não trabalha e igual a 1 quando trabalha), como eu expliquei antes.
É igualzinho eu expliquei antes, so que com essas variáveis. A mesma lógica.
Com essa tabela construída eu vou saber o período trabalhado de cada pessoa em cada grupo. Depois de saber isso eu tenho uma outra tabela que tem uma produtividade por dia de cada pessoa. Com essa tabela e esses dados vou pegar a média da pessoa naquele período naquele grupo e comparar com a média daquele grupo no mesmo período.
É bem complexo. Nem sei se consegui explicar direito.
Mas o primeiro passo é montar essa tabela.
Sera que olhando o meu script consegue vê algum erro?
Muito Obrigada!
Nao consegue me da uma amostra dos dado reais?
porque eu acho que pode ser a ordenacao dos dados na hora de verificar o previus.
O Script em si ta igual o que posso te sugerir e fazer isso :
GeralOrdenada:
NoConcatenate
Load
*
Residente Geral
Order by
DT,
Magistrado,
Cluster,
Porte;
drop table Geral;
ve se isso nao resolve.
e fazer os Min e Max baseados nesse GeralOrdenada.
e nos Order bys no Min e max fazer assim :
Magistrado,
Cluster,
Porte;
Nota: Voce tem o Id do magestrado, e Numerico? e Unico ? Se for faz pelo ID do cara que chance de acronimo e menor ( Jose da Silva existir 2x na tua base e etc)
ao inves do nome em tudo.
Oie Thiago,
Ainda sim não deu certo.
Parece que ele está poegando o início e o fim. A primeira e a última data daquele grupo. Como se ele desconsiderasse memso a folga. E tivesse registrando como folga somente a primeira folga do cluster. existem várias folgas entre o périodo que ele não registra como folga. As vezes por isso ele não esteja conseguindo identificar a data fim e esteja indo logo para a última data.
Digamos que a base é ordenada pela nome e pelas datas, ou seja vem uma pessoa seguindo a ordem cronologica, sendo que não tem uma lógica e nem ordem para o cluster e nem para o porte. Logo depois vem o nome da outra pessoa, seguindo a mesma lógica( ordenado por data) e assim sucessivamente. Geralmente uma mesma pessoa fica nos mesmos grupo, mas isso não é uma regra.
Vou te dar outro exemplo:
Magistrado | Dia | Dias Produtividade | Cluster | Porte |
José | 10/01/2015 | 1 | Grupo A | M |
José | 10/01/2015 | 1 | Grupo B | GG |
José | 11/01/2015 | 1 | Grupo A | M |
José | 11/01/2015 | 1 | Grupo B | GG |
José | 12/01/2015 | 1 | Grupo A | M |
José | 12/01/2015 | 1 | Grupo B | GG |
José | 13/01/2015 | 1 | Grupo A | M |
José | 13/01/2015 | 1 | Grupo B | GG |
José | 14/01/2015 | 1 | Grupo A | M |
José | 14/01/2015 | 1 | Grupo B | GG |
José | 15/01/2015 | 1 | Grupo A | M |
José | 15/01/2015 | 1 | Grupo B | GG |
José | 16/01/2015 | 0 | Grupo A | M |
José | 16/01/2015 | 0 | Grupo B | GG |
José | 17/01/2015 | 1 | Grupo A | M |
José | 17/01/2015 | 1 | Grupo B | GG |
José | 18/01/2015 | 1 | Grupo A | M |
José | 18/01/2015 | 1 | Grupo B | GG |
José | 19/01/2015 | 1 | Grupo A | M |
José | 19/01/2015 | 1 | Grupo B | GG |
José | 20/01/2015 | 1 | Grupo A | M |
José | 20/01/2015 | 1 | Grupo B | GG |
José | 21/01/2015 | 1 | Grupo A | M |
José | 21/01/2015 | 1 | Grupo B | GG |
José | 22/01/2015 | 1 | Grupo A | M |
José | 22/01/2015 | 1 | Grupo B | GG |
José | 23/01/2015 | 1 | Grupo A | M |
José | 23/01/2015 | 1 | Grupo B | GG |
José | 24/01/2015 | 1 | Grupo A | M |
José | 24/01/2015 | 1 | Grupo B | GG |
José | 25/01/2015 | 1 | Grupo A | M |
José | 25/01/2015 | 1 | Grupo B | GG |
José | 26/01/2015 | 1 | Grupo A | M |
José | 26/01/2015 | 1 | Grupo B | GG |
José | 27/01/2015 | 1 | Grupo A | M |
José | 27/01/2015 | 1 | Grupo B | GG |
José | 28/01/2015 | 1 | Grupo A | M |
José | 28/01/2015 | 1 | Grupo B | GG |
José | 29/01/2015 | 1 | Grupo A | M |
José | 29/01/2015 | 1 | Grupo B | GG |
José | 30/01/2015 | 1 | Grupo A | M |
José | 30/01/2015 | 1 | Grupo B | GG |
José | 31/01/2015 | 1 | Grupo A | M |
José | 31/01/2015 | 1 | Grupo B | GG |
José | 01/02/2015 | 1 | Grupo A | M |
José | 01/02/2015 | 1 | Grupo B | GG |
José | 02/02/2015 | 1 | Grupo A | M |
José | 02/02/2015 | 1 | Grupo B | GG |
José | 03/02/2015 | 1 | Grupo A | M |
José | 03/02/2015 | 1 | Grupo B | GG |
José | 04/02/2015 | 1 | Grupo A | M |
José | 04/02/2015 | 1 | Grupo B | GG |
José | 05/02/2015 | 1 | Grupo A | M |
José | 05/02/2015 | 1 | Grupo B | GG |
José | 06/02/2015 | 1 | Grupo A | M |
José | 06/02/2015 | 1 | Grupo B | GG |
José | 07/02/2015 | 1 | Grupo A | M |
José | 07/02/2015 | 1 | Grupo B | GG |
José | 08/02/2015 | 1 | Grupo A | M |
José | 08/02/2015 | 1 | Grupo B | GG |
José | 09/02/2015 | 1 | Grupo A | M |
José | 09/02/2015 | 1 | Grupo B | GG |
José | 10/02/2015 | 1 | Grupo A | M |
José | 10/02/2015 | 1 | Grupo B | GG |
José | 11/02/2015 | 1 | Grupo A | M |
José | 11/02/2015 | 1 | Grupo B | GG |
José | 12/02/2015 | 1 | Grupo A | M |
José | 12/02/2015 | 1 | Grupo B | GG |
José | 13/02/2015 | 0 | Grupo A | M |
José | 13/02/2015 | 0 | Grupo B | GG |
José | 14/02/2015 | 0 | Grupo A | M |
José | 14/02/2015 | 0 | Grupo B | GG |
José | 15/02/2015 | 0 | Grupo A | M |
José | 15/02/2015 | 0 | Grupo B | GG |
José | 16/02/2015 | 0 | Grupo A | M |
José | 16/02/2015 | 0 | Grupo B | GG |
José | 17/02/2015 | 0 | Grupo A | M |
José | 17/02/2015 | 0 | Grupo B | GG |
José | 18/02/2015 | 0 | Grupo A | M |
José | 18/02/2015 | 0 | Grupo B | GG |
José | 19/02/2015 | 0 | Grupo A | M |
José | 19/02/2015 | 0 | Grupo B | GG |
José | 20/02/2015 | 0 | Grupo A | M |
José | 20/02/2015 | 0 | Grupo B | GG |
José | 21/02/2015 | 1 | Grupo A | M |
José | 21/02/2015 | 1 | Grupo B | GG |
José | 22/02/2015 | 1 | Grupo A | M |
José | 22/02/2015 | 1 | Grupo B | GG |
José | 23/02/2015 | 1 | Grupo A | M |
José | 23/02/2015 | 1 | Grupo B | GG |
José | 23/02/2015 | 1 | Grupo C | P |
Nesse exemplo acima, ele teria que para no dia 16/01/2015, para ambos os grupos, e recomeçar a contar a data 17/01/2015 e novamente parar no dia 13/02/2015 e depois só voltar no dia 21/02/2015.
Isso levando em conta que se muda o nome, ou o cluster ou o porte, também passsa a contar como outra data. O que aparentemente o script está realizando perfeitamente.
Acho que o problema está no dia trabalhado. Ele está pegando somente a primeira e a última data.
E na hora de anotar a folga está acontecendo a mesma coisa, está registrando o primeiro dia de folga e o último dia de folga. Desconsiderando todas as folgas que existem entre a primeira e a última.
Tem alguma ideia do que fazer para tentar rodar corretamente?