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

Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!

Reply
Anonymous
Not applicable

Adicionar linhas entre data inicio e data fim (loop while)

Bom dia,

Hoje me deparei com um problema que eu sabia que chegaria algum dia... Preciso almentar o número de registros na minha tabela baseado em uma regra. Eu resolvia esse tipo de problema com "while" em outra ferramenta, mas em linguagem M não consegui encontrar uma solução.
A baixo segue um exemplo simplório.

CONTAEMPRESADATA INICIODATA FIM
000000emp 101/11/202001/02/2021
111111emp 101/05/202101/06/2021
222222emp 201/04/202101/06/2021


Baseado na tabela a cima, eu preciso criar todos os meses entre o inicio e o fim. O resultado esperado é:

CONTAEMPRESAMES ANO
000000emp 101/11/2020
000000emp 101/12/2020
000000emp 101/01/2021
000000emp 101/02/2021
111111emp 101/05/2021
111111emp 101/06/2021
222222emp 201/04/2021
222222emp 201/05/2021
222222emp 201/06/2021


Obs. a solução precisa ser em M, não pode ser SQL.
Agradeço desde já pela ajuda.

1 ACCEPTED SOLUTION
Anonymous
Not applicable

Hi v-stephen-msft ,
thanks for your suggestion, but it's not like what I expected.

 

Deixo meu agradecimento também ao Gil Raviv, do datachant   que compartilhou comigo algumas possibilidades que certamente usarei no futuro.


Bom, eu cheguei a solução que esperava no dia que postei a pergunta, só não havia conseguido passar para compartilhar a solução. De forma resumida, fiz um loop com list.generate() onde incrementava dois valores dependendo da condição, algo mais parecido com um loop aninhado. Hora incrementava a data (loop interno) hora incrementava a linha (loop externo).

Desta forma a iteração funciona corretamente, mas é indispensável a utilização da tabela em buffer para conjuntos grandes.

 

imagem 1.png

Última observação, a função list.generate() possúi um terceiro argumento opcional que permite especificar o que será retornado, podemdo assim omitir a coluna i (identificador da linha) e a coluna fim que não possuem mais utilidade.

View solution in original post

5 REPLIES 5
Anonymous
Not applicable

MarceloHSA_0-1623696324586.png

 

Anonymous
Not applicable

Hi v-stephen-msft ,
thanks for your suggestion, but it's not like what I expected.

 

Deixo meu agradecimento também ao Gil Raviv, do datachant   que compartilhou comigo algumas possibilidades que certamente usarei no futuro.


Bom, eu cheguei a solução que esperava no dia que postei a pergunta, só não havia conseguido passar para compartilhar a solução. De forma resumida, fiz um loop com list.generate() onde incrementava dois valores dependendo da condição, algo mais parecido com um loop aninhado. Hora incrementava a data (loop interno) hora incrementava a linha (loop externo).

Desta forma a iteração funciona corretamente, mas é indispensável a utilização da tabela em buffer para conjuntos grandes.

 

imagem 1.png

Última observação, a função list.generate() possúi um terceiro argumento opcional que permite especificar o que será retornado, podemdo assim omitir a coluna i (identificador da linha) e a coluna fim que não possuem mais utilidade.

Tua solução salvou meu projeto.
Muito obrigado!!!

Bom dia, eu tentei essa solução que você sugeriu, porém não tive sucesso.

 

let
Fonte = Python.Execute("import pandas as pd#(lf)#(lf)#(lf)lista = { ""Id"":[1,2,2,3],#(lf) ""Colaborador"":[""João"",""José"",""Mario"",""Vicente""],#(lf) ""Data Inicio"":[""20/03/2023"",""29/03/2023"",""01/04/2023"",""15/04/2023""],#(lf) ""Data Fim"":[""10/04/2023"", ""15/04/2023"",""15/04/2023"",""15/05/2023""]#(lf)#(lf)}#(lf)#(lf)df = pd.DataFrame(lista)#(lf)#(lf)print(df)"),
df1 = Fonte{[Name="df"]}[Value],
#"Tipo Alterado" = Table.TransformColumnTypes(df1,{{"Data Inicio", type date}, {"Data Fim", type date}}),
Tab = Table.Buffer(#"Tipo Alterado"),
#"Numero Linhas" = Table.RowCount(tab),
#"Adição Datas" =
List.Generate(
()=> [i=0,Id = tab{i}[Id], Colaborador = tab{i}[Colaboador], dtini=tab{i}[Data Inicio],dtfim=tab{i}[Data Fim]],
each i < #"Numero Linhas",
each
if [Data Inicio] < [Data Fim]
then [i=[i], Id = [Id], Colaborador = [Colaboador], dtini=Date.AddDays([Data Inicio],1),dtfim=[Data Fim]]
else [i=[i]+1,Id = tab{i}[Id], Colaborador = tab{i}[Colaboador], dtini=tab{i}[Data Inicio],dtfim=tab{i}[Data Fim]]
)
in
#"Adição Datas"

 

tentei fazer desta forma, porém recebo um erro 

 

Michel_Soares_0-1681385244543.png

 

v-stephen-msft
Community Support
Community Support

Hi @Anonymous ,

 

First create a custom column, get the next day, separate the four date columns to get four tables.

7.png

 

And then keep the column names of the date columns consistent, and then merge. About append queries.

8.png

 

After removing duplicates, the result is this.

9.png

 

 

Best Regards,

Stephen Tao

 

If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

Helpful resources

Announcements
April AMA free

Microsoft Fabric AMA Livestream

Join us Tuesday, April 09, 9:00 – 10:00 AM PST for a live, expert-led Q&A session on all things Microsoft Fabric!

March Fabric Community Update

Fabric Community Update - March 2024

Find out what's new and trending in the Fabric Community.

Top Solution Authors
Top Kudoed Authors