martes, 29 de noviembre de 2022

Power Query: Anexar tablas sin repetidos

Hoy toca un ejercicio que me ha parecido muy interesante, por su utilidad en el día a día...
Se trata de anexar diferentes tablas con información temporal, donde se producen duplicidades de información, al repetirse fechas (las últimas de una tabla pueden ser las primeras de la siguiente!!).

Un ejemplo muy claro, extraemos de nuestro sistema de contabilidad un listado de ventas filtrando entre una fecha y otra...
La semana siguiente volvemos a sacar el mismo informe, pero hemos olvidado el filtro de fechas anterior, y determinamos un intervalo de fechas que se solapa en parte con el anterior fichero... (existiendo registros repetidos!!), y sucesivamente.

Podríamos pensar que la función M Table.Distinct podría ayudarnos... pero la realidad del día a día nos pone en nuestro sitio, y nos propone situaciones donde de forma correcta existen movimientos idénticos en una misma fecha!!.
Por lo que aplicar Table.Distinct tendría un efecto adverso al eliminar estos registros :'(
Veamos en la siguiente imagen la situación...
Power Query: Anexar tablas sin repetidos

Si te fijas en las tres tablas originales, en la primera existe un movimiento doble idéntico, lo que es correcto.
Mientras que en las otras dos tablas tenemos una repetición de registros iniciales con los últimos de la tabla previa...

La solución con Table.Distinct (imagen de la derecha) NO nos sirve ya que, si bien elimina las fechas repetidas entre tablas, también elimina las intratablas correctas!!.

Veamos una posible solución, empleando la función List.Accumulate que nos permitirá procesar la información de las distintas tablas..

Cargaremos nuestras tres tablas en nuestro modelo de Power Query y crearemos la siguiente consulta:
let
    //Lista con las tablas a trabajar
    LstTablas={Tabla1,Tabla2,Tabla3},

    //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(
                LstTablas,      //lista que recorremos
                LstTablas{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

Ejecutamos la consulta y BOOM... nuestro listado sin duplicidades de registro.

La potencia de List.Accumulate al permitir recorrer un listado de datos (de Tablas en mi ejemplo), e ir aplicándole filtros excluyente según la fecha máxima de la tabla acumulada previa, es perfecta para el ejemplo!!.

ATENCIÓN!!! fundamental que la secuencia de tablas se lea en el orden temporal adecuado!!.
Si fuera necesario habría que aplicar una acción para ordenarlas primero, antes de 'pasarlos' por el proceso.

No hay comentarios:

Publicar un comentario

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