miércoles, 11 de agosto de 2021

Power Query: Claves Primarias Table.AddKey

Hablaremos hoy de un aspecto interesante cuando trabajamos con grandes bases de datos: las claves primarias.

Si estás habituado a trabajar con sistemas SQL (en realidad con todo tipo de gestores de base de datos) sabrás de la importancia que tiene definir Claves primarias asociadas a las tablas de trabajo.
Notemos que las exigencias necesarias en otros sistemas (indexación campos, integridad, ...) no aplican a nuestro editor de power Query.
En general definir Columnas como 'clave primaria' no aportará nada especial directamente a nuestras consultas, si bien (aquí viene la ventaja) cuando necesitemos combinar o relacionar información entre distintas tablas o fuentes, el haber definido estas claves agilizará y dará rapidez al cruce de datos!!!

Ventajas relevantes cuando necesitemos combinar bases de datos con grandes volúmenes de datos...

Dentro del lenguaje M de Power Query nos encontramos con tres funciones que gestionan este tipo de claves:
Table.Keys(table as table) as list
Esta función identifica y nos retorna una lista con las claves primarias existentes en la tabla indicada.

Table.AddKey(table as table, columns as list, isPrimary as logical) as table
función que agrega una clave a nuestra tabla, teniendo en cuenta una lista de columnas (una o varias) que identifican la clave primaria. El último argumento lógico true/false confirma si queremos que esa lista sea nuestra clave primaria.

Table.ReplaceKeys(table as table, keys as list) as table
Reemplaza las claves primarias existentes por la nueva lista de columnas informadas en forma de Record!!...

Otra función interesante y relacionada con las claves primarias es la función: Table.Group(table as table, key as any, aggregatedColumns as list, optional groupKind as nullable number, optional comparer as nullable function) as table
ya que en el mismo momento que realicemos la agrupación, sobre las columnas indicadas en el segundo argumento, se está definiendo para esa tabla que dichas columnas componen la 'clave primaria'!!.

Veamos algunos ejemplos de estas funciones....
Supongamos tenemos las siguientes tres tablas (TblVENTAS,TblPRECIOS y TblDESCUENTOS), las cuales hemos cargado a nuestro editor de Power Query:
Power Query: Claves Primarias Table.AddKey

En primer lugar, con la TblVENTAS cargada, procederemos a realizar una agrupación por las columnas 'País' y 'Comercial', y sumando (por ejemplo) las 'Unidades'.
El código M de esta agrupación (cuya tabla resultante llamaremos 'TblVENTAS_Agrupado') podría ser:
let
    Origen = Excel.CurrentWorkbook(){[Name="TblVENTAS"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Fechas", type datetime}, {"País", type text}, {"Comercial", type text}, {"Producto", type text}, {"Unidades", Int64.Type}}),

    //Agrupación por las colummnas País y Comercial...
    FilasAgrupadas = Table.Group(TipoCambiado, {"País", "Comercial"}, {{"Suma_Uds", each List.Sum([Unidades]), type nullable number}})
in
    FilasAgrupadas

Esto no es relevante en el día de hoy.
Lo interesante es que con la función Table.Keys comprobaremos y obtendremos un lista de las claves primarias que se han generado al mismo tiempo que la agrupación.

Crearemos, dentro del editor de Power Query, la siguiente función personalizada (que llamaré 'fxCheckKeys'), desde una Consulta en blanco, basada en Table.Keys, que nos permitirá recuperar esa info:
(Tabla as table)=>
let
    Origen = Table.Keys(Tabla),
    RecuperamosRegistro= Table.FromRecords(Origen),
    ExpandeColumna= Table.ExpandListColumn(RecuperamosRegistro, "Columns")
in
    ExpandeColumna

Busco solo obtener una tabla que muestre la/s clave/s existentes...

Si invocamos directamente a nuestra función 'fxCheckKeys' indicando nuestra tabla agrupada:
Power Query: Claves Primarias Table.AddKey

La función nos muestra la siguiente tabla con las claves primarias definidas a partir de la agrupación:
Power Query: Claves Primarias Table.AddKey


Emplearemos ahora la función Table.AddKeys para añadir una clave primaria sobre la 'TblPRECIOS'.
Así pues accederemos desde el editor avanzado en la consulta de 'TblPRECIO' donde añadiremos la siguiente línea:
let
    Origen = Excel.CurrentWorkbook(){[Name="TblPRECIO"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Producto", type text}, {"Precio", type number}}),

    //Añadimos una clave primaria única sobre el campo 'Producto'
    Add_Key=Table.AddKey(TipoCambiado,{"Producto"},true)
in
    Add_Key

Igual que antes podemos invocar a nuestra función personalizada 'fxCheckKeys' y veremos:
Power Query: Claves Primarias Table.AddKey


Y como último ejercicio aplicaremos la función Table.ReplaceKeys sobre la TblVTAS_Agrupado (donde habíamos comprobado esa doble clave: País, Comercial), reemplazando esa clave doble por una sencilla sobre el 'País'.
Por tanto, accederemos a la query 'TblVENTAS_Agrupado' y añadiremos:
let
    Origen = Excel.CurrentWorkbook(){[Name="TblVENTAS"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Fechas", type datetime}, {"País", type text}, {"Comercial", type text}, {"Producto", type text}, {"Unidades", Int64.Type}}),

    //Agrupación por las colummnas País y Comercial...
    FilasAgrupadas = Table.Group(TipoCambiado, {"País", "Comercial"}, {{"Suma_Uds", each List.Sum([Unidades]), type nullable number}}),

    //Reemplazamos las claves existentes por una nueva, que incluye solo el País
    //OJO!!, en este caso debemos informar la clave en forma de Record!!
    CambioKeys=Table.ReplaceKeys(FilasAgrupadas, {[Columns="País", Primary=true]})
in
    CambioKeys

Verifica con la función 'fxCheckKeys' que ahora, para esta tabla agrupada, la clave primaria es solo la columna 'País' ;-)

Una última curiodidad... si queremos reemplazar la clave primaria por un conjunto de columnas, el Record tendría esta forma:
[Columns={"País","Producto"}, Primary=true]

Podemos ver en el siguiente código, similar al anterior, cómo funciona el reemplazamiento de 'claves primarias':
let
    Origen = Excel.CurrentWorkbook(){[Name="TblVENTAS"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Fechas", type datetime}, {"País", type text}, {"Comercial", type text}, {"Producto", type text}, {"Unidades", Int64.Type}}),

    //Agrupación por las colummnas País y Comercial...
    FilasAgrupadas = Table.Group(TipoCambiado, {"País", "Comercial","Producto"}, {{"Suma_Uds", each List.Sum([Unidades]), type nullable number}}),

    //Reemplazamos las claves existentes por una nueva, que incluye solo el País
    //OJO!!, en este caso debemos informar la clave en forma de Record!!
    //en caso de reemplazar por varias claves el REcord tendría esta forma:
    CambioKeys=Table.ReplaceKeys(FilasAgrupadas, {[Columns={"País","Producto"}, Primary=true]})
in
    CambioKeys


Veremos en siguientes entregas la ventaja de definir estas claves primarias en Power Query.

No hay comentarios:

Publicar un comentario

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