jueves, 1 de diciembre de 2022

Power Query: Ordenar Tablas

Al hilo de la publicación anterior sobre cómo anexar tablas sin repeticiones de registros (echa un vistazo), y donde mencionaba que debíamos tener cuidado de disponer de nuestras tablas en un orden concreto...
Y como me ha llegado algún correo preguntando por la manera de automatizar este orden de tablas, he decidido escribir al respecto.

El planteamiento es el siguiente...
Tenemos un conjunto de tablas, donde cada una de ellas muestra registros dispuestos en un intervalo de fechas.
Ocurre además que dichos intervalos entre tablas pueden solaparse, y generar registros duplicados (ya tratado en el post previo).
Para el correcto funcionamiento del código de dicho post, se requiere que las tablas se procesen en un orden temporal adecuado...
Y esto es lo que vamos a conseguir.

Para ordenar nuestras tablas vamos a emplear List.Sort, puesto que en realidad partimos de una lista de tablas.
Y como comparador para determinar el orden de cada tabla en el conjunto la función Value.Comparer, función que nos permitirá trabajar sobre el contenido de cada tabla de nuestra lista.
Power Query: Ordenar Tablas


Una vez cargadas todas las tablas (en color azul a la izquierda de la imagen, con nombres: Tabla1, Tabla2, Tabla3, Tabla4, y Tabla5), accedemos al Editor de Power Query y creamos una Consulta en blanco con el siguiente código:
let
    //Lista con las tablas a trabajar
    LstTablas={Tabla1,Tabla2,Tabla3,Tabla4,Tabla5},

    //aplicamos List.Sort para ordenar nuestras tablas
    LstOrdenada=List.Sort(LstTablas, (x, y) => Value.Compare(List.Min(x[Fecha]),List.Min(y[Fecha]) )),
    
    //Proceso que acumula registros de las distintas tablas
    //cuando los registros cumplan una condición
    //que su fecha sea posterior a la del acumulado anterior
    Combinada= List.Accumulate(
                LstOrdenada,      //lista que recorremos
                LstOrdenada{0},   //inicio 
                (acum,tbl)=>    //transformación a aplicar
                    let 
                        Fmax=List.Max(acum[Fecha]),
                        rdo=Table.Combine({acum,Table.SelectRows(tbl, each [Fecha]>Fmax)})
                    in rdo)
in
    Combinada

Fíjate especialmente en la segúnda línea:
...
    //aplicamos List.Sort para ordenar nuestras tablas
    LstOrdenada=List.Sort(LstTablas, (x, y) => Value.Compare(List.Min(x[Fecha]),List.Min(y[Fecha]) )),
    ...

la cual nos genera una nueva lista de Tablas pero ya ordenadas por las fechas contenidas en cada una de ellas.
Power Query: Ordenar Tablas

Tablas ordenadas tal como necesitábamos.
El resto del proceso es el ya comentado, donde se trata a cada una de las tablas.

Muy interesante el uso de la Lista de tablas del inicio, y como la función List.Sort y su función de comparación:
(x, y) => Value.Compare(List.Min(x[Fecha]),List.Min(y[Fecha]) )
que nos ha permitido operar y comparar sobre las 'fechas' de cada tabla, con el fin de reordenarlas entre sí.
Fantástica combinación!!.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.