Ir para conteúdo
  • 0

Índice personalizado por grupo


Henrique Merola Faria
Ir para solução Solucionado por Felipe Bitencourt Santana De Magalhães ,

Pergunta

  • Alunos

Bom dia !
Preciso de ajuda para criar no Power Query um índice conforme a figura abaixo,
sendo estes os dados úteis disponíveis na base, não há mais nada que possa ser usado.

- o Índice é igual para todos os elementos de cada grupo
- o Separador indica o início do grupo
- os grupos se repetem aleatoriamente como na figura
- grupos "iguais" podem se repetir em sequencia, e tem de ser numerados separadamente
  (vide Item CCCCCCC, Indice 5 e 6)
- logicamente, essa tabela cresce com o tempo
- Importante: a ordem dos blocos e dos elementos do bloco não pode ser alterada

Toda ajuda é bem vinda !!!

image.png.d5009ffe0dbe7ce908f78f03cbda45e4.png

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos
  • Solução
Postado (editado)

Bom dia, Henrique
Tudo bem?

Segue a minha solução, porém, ele inicia o indice no 2. Eu não ainda não consegui fazer a lógica dele começar o índice no 1, estou quebrando a cabeça aqui rs.

 

let
    Fonte = Excel.Workbook(File.Contents("C:\Users\felip\Downloads\bbbbbbbb.xlsx"), null, true),
    Planilha1_Sheet = Fonte{[Item="Planilha1",Kind="Sheet"]}[Data],
    Origem = Table.PromoteHeaders(Planilha1_Sheet, [PromoteAllScalars=true]),

    AdicionarIndiceAux = Table.AddIndexColumn(Origem, "ÍndiceAux", 0, 1, Int64.Type),

    ListaIndiceDesejado = List.Accumulate(
        {0..Table.RowCount(AdicionarIndiceAux) - 1},
        [Indice = 1, Lista = {}],
        (estado, i) =>
            let
                LinhaAtual = AdicionarIndiceAux{i},
                ValorSeparador = LinhaAtual[Separador],
                ValorAnterior = if i = 0 then estado[Indice] else estado[Lista]{i - 1},
                NovoIndice = if ValorSeparador <> null then ValorAnterior + 1 else ValorAnterior
            in
                [Indice = NovoIndice, Lista = List.Combine({estado[Lista], {NovoIndice}})]
    )[Lista],

    AdicionarIndiceDesejado = Table.AddColumn(AdicionarIndiceAux, "Indice Desejado", each ListaIndiceDesejado{[ÍndiceAux]}),

    RemoverIndiceAux = Table.RemoveColumns(AdicionarIndiceDesejado, {"ÍndiceAux"})

in
    RemoverIndiceAux

 

Editado por Felipe Bitencourt Santana De Magalhães
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Boa tarde, @Felipe Bitencourt Santana De Magalhães agora está tudo bem !

Tu é fera, hein !
Eu imaginava que a solução seria um cálculo em loop, mas ainda está acima de meus conhecimentos.
Muito bom mesmo !!!!

O problema de iniciar o índice no 2 era que faltava identificar que estava no Primeiro separador.
Depois de algumas tentativas, essa alteração aqui funcionou:

                NovoIndice = if ValorSeparador <> null and LinhaAtual[ÍndiceAux] = 0   // Primeiro Separador e define valor = 1
                            then 1 
                            else if ValorSeparador <> null then ValorAnterior + 1 
                            else ValorAnterior

Muito obrigado mesmo, mestre !!!

// ========================================================================================
 

let
    Fonte = Excel.Workbook(File.Contents("E:\Documentos\PowerBI\Data PBI\Index por Grupo.xlsx"), null, true),
    Planilha1_Sheet = Fonte{[Item="Grupos",Kind="Sheet"]}[Data],
    Origem = Table.PromoteHeaders(Planilha1_Sheet, [PromoteAllScalars=true]),
    AdicionarIndiceAux = Table.AddIndexColumn(Origem, "ÍndiceAux", 0, 1, Int64.Type),

    ListaIndiceDesejado = List.Accumulate(
        {0..Table.RowCount(AdicionarIndiceAux) - 1},
        [Indice = 1, Lista = {}],
        (estado, i) =>
            let
                LinhaAtual = AdicionarIndiceAux{i},
                ValorSeparador = LinhaAtual[Separador],
                ValorAnterior = if i = 0 then estado[Indice] else estado[Lista]{i - 1},
                //NovoIndice = if ValorSeparador <> null then ValorAnterior + 1 else ValorAnterior
                NovoIndice = if ValorSeparador <> null and LinhaAtual[ÍndiceAux] = 0   // Primeiro Separador e define valor = 1
                            then 1 
                            else if ValorSeparador <> null then ValorAnterior + 1 
                            else ValorAnterior
            in
                [Indice = NovoIndice, Lista = List.Combine({estado[Lista], {NovoIndice}})]
    )[Lista],

    AdicionarIndiceDesejado = Table.AddColumn(AdicionarIndiceAux, "Chave", each ListaIndiceDesejado{[ÍndiceAux]}),

    RemoverIndiceAux = Table.RemoveColumns(AdicionarIndiceDesejado,{"ÍndiceAux", "Indice Desejado"})

in
    RemoverIndiceAux


 

  • Like 1
Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...