Saltar al contenido principal Saltar al contenido complementario

Manejo de datos jerárquicos

Las jerarquías son una parte importante de cualquier solución de business intelligence; se utilizan para describir dimensiones que contienen de forma natural diferentes niveles de granularidad. Algunas son simples e intuitivas, mientras que otras son complejas y exigen pensar mucho hasta poder modelarlas correctamente.

Desde la parte superior de una jerarquía hasta la parte inferior, los miembros son cada vez más detallados y específicos. Por ejemplo, en una dimensión que contenga los niveles Mercado, País, Estado y Ciudad, el miembro América aparece en la parte superior de la jerarquía, el miembro U.S.A. aparece en el segundo nivel, el miembro California aparece en el tercer nivel y San Francisco en el nivel más inferior. California es más específico que U.S.A. y San Francisco es más específico que California.

Almacenar las jerarquías en un modelo relacional es un desafío común con múltiples soluciones. Hay distintos enfoques:

  • La jerarquía horizontal
  • El modelo de lista adyacente
  • El método de enumeración de rutas
  • El modelo de conjuntos anidados
  • El listado de antepasados

Para lo que nos interesa en este tutorial, crearemos un listado de antepasados ya que presenta la jerarquía de una forma que es directamente utilizable en una consulta. Puede encontrar más información sobre los demás enfoques en Qlik Community.

El prefijo Hierarchy

El prefijo Hierarchy es un comando de script que se sitúa frente a una sentencia LOAD o SELECT que carga una tabla de nodos adyacentes. La sentencia LOAD necesita tener al menos tres campos: Un ID que es una clave única para el nodo, una referencia al padre y un nombre.

El prefijo transformará una tabla cargada en una tabla de nodos expandidos; una tabla que tenga varias columnas añadidas, una por cada nivel de la jerarquía.

  1. Cree una nueva app y asígnele un nombre.
  2. Agregue una nueva sección de script en el Editor de carga de datos.
  3. Denomine a la sección Wine.
  4. En DataFiles en el menú a la derecha, haga clic en Seleccionar datos.

  5. Cargue y después seleccione Winedistricts.txt.
  6. En la ventana Seleccionar datos desde, desmarque los campos Lbound y RBound para que no se carguen.
  7. Haga clic en Insertar script.
  8. Inserte lo siguiente encima de la sentencia LOAD:
  9. Hierarchy (NodeID, ParentID, NodeName)

    Su script debería tener el aspecto siguiente:

    Hierarchy (NodeID, ParentID, NodeName)
    LOAD
        NodeID,
        ParentID,
        NodeName
    FROM [lib://DataFiles/Winedistricts.txt] 
    (txt, utf8, embedded labels, delimiter is '\t', msq);			

  10. Haga clic en Cargar datos.
  11. Utilice la sección Vista previa del Visor del modelo de datos para ver la tabla resultante.
  12. La tabla de nodos expandidos resultante tiene exactamente el mismo número de registros que su tabla de origen: Uno por nodo. La tabla de nodos expandidos es muy práctica puesto que cumple diversos requisitos para analizar una jerarquía en un modelo relacional:

    • Todos los nombres de nodos existen en una misma columna, de modo que esto puede utilizarse para hacer búsquedas.
    • Además, los distintos niveles de nodos se han expandido en un campo cada uno; los campos que se pueden utilizar en grupos jerárquicos o como dimensiones en tablas pivotantes.
    • Además, los distintos niveles de nodos se han expandido en un campo cada uno; los campos que se pueden utilizar en grupos jerárquicos.
    • Se puede hacer que contenga una ruta única al nodo, enumerando todos los antepasados en el orden correcto.
    • Se puede hacer que contenga la profundidad del nodo, es decir, la distancia a la base.

    La tabla resultante tiene el siguiente aspecto:

    Tabla que muestra una muestra de datos cargados usando el prefijo Hierarchy

    Tabla que muestra una muestra de datos cargados usando el prefijo Hierarchy

El prefijo HierarchyBelongsTo

Al igual que el prefijo Hierarchy, el prefijo HierarchyBelongsTo es un comando de script que se coloca frente a una sentencia LOAD o SELECT que carga una tabla de nodos adyacentes.

También aquí la sentencia LOAD necesita tener al menos tres campos: Un ID que es una clave única para el nodo, una referencia al padre y un nombre. El prefijo transformará la tabla cargada en una tabla de antepasados; una tabla que tiene cada combinación de un antepasado y un descendiente listados como registros aparte. Esto hace que sea muy fácil hallar todos los antepasados o todos los descendientes de un nodo específico.

  1. Modifique la sentencia Hierarchy en el Editor de carga de datos de modo que se lea lo siguiente:
  2. HierarchyBelongsTo (NodeID, ParentID, NodeName, BelongsToID, BelongsTo)
  1. Haga clic en Cargar datos.
  2. Utilice la sección Vista previa del Visor del modelo de datos para ver la tabla resultante.
  3. La tabla de antepasados cumple diversos requisitos para analizar una jerarquía en un modelo relacional:

    • Si el ID de nodo representa los nodos únicos, el ID de antepasado representa los árboles y subárboles completos de la jerarquía.
    • Todos los nombres de nodos existen tanto en su rol de nodos, como en su rol de árboles, y ambos pueden utilizarse para hacer búsquedas.
    • Se puede hacer que contengan la diferencia de profundidad entre la profundidad de nodo y la profundidad de antepasado, esto es, la distancia desde la raíz del subárbol.

    La tabla resultante tiene el siguiente aspecto:

    Tabla que muestra unos datos cargados usando el prefijo HierarchyBelongsTo

    Tabla que muestra los datos cargados usando el prefijo HierarchyBelongsTo.

Autorización

Es bastante frecuente que las jerarquías se utilicen para dar autorizaciones. Un ejemplo lo tendríamos en la estructura laboral jerárquica de una organización. Cada director tiene derecho a ver todo lo que pertene a su propio departamento, incluidos todos sus subdepartamentos. Pero no necesariamente tendrían derecho a ver otros departamentos.

Ejemplo de jerarquía de una organización

Esto significa que a diferentes personas se les permitirá ver diferentes subárboles de la organización. La tabla de autorización tendrá el siguiente aspecto:

Tabla de autorización
ACCESONTNAMEPERSONAPUESTOPERMISOS
USUARIOACME\JRLJohnDirector de productoRRHH
USUARIOACME\CAHCarolDirector generalDirector general
USUARIOACME\JERJamesDirector de ingenieríaIngeniería
USUARIOACME\DBKDianaDirector financieroFinanciero
USUARIOACME\RNLBobDirector de operacionesVentas
USUARIOACME\LFDLarryDirector de sistemas informáticosProducto

En este caso, a Carol se le permite ver todo lo que pertenece al CEO y por debajo; a Larry se le permite ver la organización de Product; y a James se le permite ver solo la organización de Engineering.

Ejemplo:  

A menudo la jerarquía se almacena en una tabla de nodos adyacentes. En este ejemplo, para resolver esto cargue la tabla de nodos adyacentes utilizando un HierarchyBelongsTo y denomine al campo del ancestro Tree.

Si desea usar Section Access, cargue una copia en mayúsculas de Tree y llame a este nuevo campo PERMISSIONS. Por último, necesita cargar la tabla de autorizaciones. Estos dos últimos pasos se pueden hacer usando las siguientes líneas de script. Observe que la tabla TempTrees es la tabla creada por la sentencia HierarchyBelongsTo.

Tenga en cuenta que esto es solo un ejemplo. No hay ejercicios de acompañamiento que completar en Qlik Sense.

Trees: LOAD *, Upper(Tree) as PERMISSIONS Resident TempTrees; Drop Table TempTrees;   Section Access; Authorization: LOAD ACCESS, NTNAME, UPPER(Permissions) as PERMISSIONS From Organization; Section Application;

Este ejemplo produciría el siguiente modelo de datos:

Modelo de datos: Las tablas Authorization, Trees, Fact y Nodes

Modelo de datos:

¿Esta página le ha sido útil?

No dude en indicarnos en qué podemos mejorar si encuentra algún problema en esta página o su contenido, como, por ejemplo, errores tipográficos, pasos que falta o errores técnicos.