Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Socorro!

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:

  

NomeDiaDias de ProduçãoGrupo
João12/12/20171Grupo 1
João12/12/20170-
João13/12/20171Grupo 1
João13/12/20171Grupo 1
João14/12/20171Grupo 2
Maria12/12/20170-
Maria12/12/20171Grupo 1
Maria14/12/20171Grupo 1
Maria14/12/20171Grupo 2
Maria14/12/20170-
Maria15/12/20171Grupo 1
Ana15/12/20171Grupo 1
Ana16/12/20171Grupo 1
Ana17/12/20170-
Ana18/12/20171Grupo 2

E através dela precisava gerar uma igual esta:

   

NomeData InícioData FimGrupo
João12/12/201712/12/2017Grupo 1
João13/12/204713/12/2017Grupo 1
João14/12/201714/12/2017Grupo 2
Maria12/12/201714/12/2017Grupo 1
Maria14/12/201714/12/2017Grupo 2
Maria15/12/201715/12/2017Grupo 1
Ana15/12/201716/12/2017Grupo 1
Ana18/12/201718/12/2017Grupo 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.

27 Replies
srchagas
Creator III
Creator III

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
Maria1Grupo 1M29/08/201631/01/2017Trabalhado
Maria1Grupo 2M31/01/201731/01/2017Trabalhado
Maria1Grupo 3P02/02/201703/03/2017Trabalhado
Maria0Grupo 3P04/03/201704/03/2017Folga
Maria1Grupo 3G05/03/201706/03/2017Trabalhado
Anonymous
Not applicable
Author

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!

srchagas
Creator III
Creator III

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
Maria1Grupo 1M29/08/201631/01/2017Trabalhado
Maria1Grupo 2M31/01/201731/01/2017Trabalhado
Maria1Grupo 3P02/02/201703/03/2017Trabalhado
Maria0Grupo 3P04/03/201704/03/2017Folga
Maria1Grupo 3P05/03/201705/03/2017Trabalhado
Maria1Grupo 3G05/03/201706/03/2017Trabalhado
Anonymous
Not applicable
Author

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:

  1. Nome , Dia , Dias Produtividade , Grupo , Porte 
  2. Maria , 29/08/2016 , 1 , Grupo 1 , M 
  3. Maria , 30/08/2016 , 1 , Grupo 1 , M 
  4. Maria , 31/01/2017 , 1 , Grupo 1 , M 
  5. Maria , 31/01/2017 , 1 , Grupo 2 , M 
  6. Maria , 02/02/2017 , 1 , Grupo 3 , P 
  7. Maria , 03/03/2017 , 1 , Grupo 3 , P 
  8. Maria , 04/03/2017 , 0 , Grupo 3 , P 
  9. Maria , 05/03/2017 , 1 , Grupo 3 , P 
  10. Maria , 05/03/2017 , 1 , Grupo 3 , G 
  11. Maria , 06/03/2017 , 1 , Grupo 3 , G 
  12. João , 07/03/2017 , 1 , Grupo 3 , G 
  13. João , 08/03/2017 , 0 , Grupo 4 , G 
  14. João , 09/03/2017 , 1 , Grupo 3 , G 
  15. João , 09/03/2017 , 1 , Grupo 3 , M   


Encontrei o seguinte resultado:


 

NomeDtInicialStatusDtFinalStatusGrupoPorteStatus
Maria29/08/201631/01/2017Grupo 1MTrabalhado
Maria31/01/201731/01/2017Grupo 2MTrabalhado
Maria02/02/201703/03/2017Grupo 3PTrabalhado
Maria04/03/201704/03/2017Grupo 3PFolga
Maria05/03/201705/03/2017Grupo 3PTrabalhado
Maria05/03/201706/03/2017Grupo 3GTrabalhado
João07/03/201709/03/2017Grupo 3GTrabalhado
João09/03/201709/03/2017Grupo 3MTrabalhado
João08/03/201708/03/2017Grupo 4GFolga

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:

NomeDia InicioDia FimGrupoPorte
Maria29/08/201631/01/2017Grupo 1M
Maria31/01/201731/01/2017Grupo 2M
Maria02/02/201703/03/2017Grupo 3P
Maria05/03/201705/03/2017Grupo 3P
Maria05/03/201706/03/2017Grupo 3G
João07/03/201707/03/2017Grupo 3G
João09/03/201709/03/2017Grupo 3G
João09/03/201709/03/2017Grupo 3

M

Teria como acrescentar isso no código?

srchagas
Creator III
Creator III

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
Maria1Grupo 1M29/08/201631/01/2017Trabalhado
Maria1Grupo 2M31/01/201731/01/2017Trabalhado
Maria1Grupo 3P02/02/201703/03/2017Trabalhado
Maria0Grupo 3P04/03/201704/03/2017Folga
Maria1Grupo 3P05/03/201705/03/2017Trabalhado
Maria1Grupo 3G05/03/201706/03/2017Trabalhado
João1Grupo 3G07/03/201707/03/2017Trabalhado
João0Grupo 4G08/03/201708/03/2017Folga
João1Grupo 3G09/03/201709/03/2017Trabalhado
João1Grupo 3M09/03/201709/03/2017Trabalhado
Anonymous
Not applicable
Author

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!

srchagas
Creator III
Creator III

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.


Anonymous
Not applicable
Author

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:

    

MagistradoDiaDias ProdutividadeClusterPorte
José10/01/20151Grupo AM
José10/01/20151Grupo BGG
José11/01/20151Grupo AM
José11/01/20151Grupo BGG
José12/01/20151Grupo AM
José12/01/20151Grupo BGG
José13/01/20151Grupo AM
José13/01/20151Grupo BGG
José14/01/20151Grupo AM
José14/01/20151Grupo BGG
José15/01/20151Grupo AM
José15/01/20151Grupo BGG
José16/01/20150Grupo AM
José16/01/20150Grupo BGG
José17/01/20151Grupo AM
José17/01/20151Grupo BGG
José18/01/20151Grupo AM
José18/01/20151Grupo BGG
José19/01/20151Grupo AM
José19/01/20151Grupo BGG
José20/01/20151Grupo AM
José20/01/20151Grupo BGG
José21/01/20151Grupo AM
José21/01/20151Grupo BGG
José22/01/20151Grupo AM
José22/01/20151Grupo BGG
José23/01/20151Grupo AM
José23/01/20151Grupo BGG
José24/01/20151Grupo AM
José24/01/20151Grupo BGG
José25/01/20151Grupo AM
José25/01/20151Grupo BGG
José26/01/20151Grupo AM
José26/01/20151Grupo BGG
José27/01/20151Grupo AM
José27/01/20151Grupo BGG
José28/01/20151Grupo AM
José28/01/20151Grupo BGG
José29/01/20151Grupo AM
José29/01/20151Grupo BGG
José30/01/20151Grupo AM
José30/01/20151Grupo BGG
José31/01/20151Grupo AM
José31/01/20151Grupo BGG
José01/02/20151Grupo AM
José01/02/20151Grupo BGG
José02/02/20151Grupo AM
José02/02/20151Grupo BGG
José03/02/20151Grupo AM
José03/02/20151Grupo BGG
José04/02/20151Grupo AM
José04/02/20151Grupo BGG
José05/02/20151Grupo AM
José05/02/20151Grupo BGG
José06/02/20151Grupo AM
José06/02/20151Grupo BGG
José07/02/20151Grupo AM
José07/02/20151Grupo BGG
José08/02/20151Grupo AM
José08/02/20151Grupo BGG
José09/02/20151Grupo AM
José09/02/20151Grupo BGG
José10/02/20151Grupo AM
José10/02/20151Grupo BGG
José11/02/20151Grupo AM
José11/02/20151Grupo BGG
José12/02/20151Grupo AM
José12/02/20151Grupo BGG
José13/02/20150Grupo AM
José13/02/20150Grupo BGG
José14/02/20150Grupo AM
José14/02/20150Grupo BGG
José15/02/20150Grupo AM
José15/02/20150Grupo BGG
José16/02/20150Grupo AM
José16/02/20150Grupo BGG
José17/02/20150Grupo AM
José17/02/20150Grupo BGG
José18/02/20150Grupo AM
José18/02/20150Grupo BGG
José19/02/20150Grupo AM
José19/02/20150Grupo BGG
José20/02/20150Grupo AM
José20/02/20150Grupo BGG
José21/02/20151Grupo AM
José21/02/20151Grupo BGG
José22/02/20151Grupo AM
José22/02/20151Grupo BGG
José23/02/20151Grupo AM
José23/02/20151Grupo BGG
José23/02/20151Grupo CP

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?