Sin lugar a dudas la dimensión de fechas, mal llamada la dimensión de tiempo, es una de las dimensiones más importantes que un Datamart pueda tener. En este artículo pongo a disposición un código base para crear una dimensión de tiempo excepcional. Este interés por contar con una mejor tabla de dimensión inicio en 2009 en un proyecto de México, y luego dio un salto importante cuando agrega impartí una sesión “Empower your users with an OUTSTANDING Time Dimension” en el PASS European Conference 2010. Desde entonces uso y refino diferentes versiones de esta dimensión.
Si tienes dudas sobre el diseño dimensional puedes revisar antes los artículos de Diseño Dimensional: Como crear una tabla de dimensión o Diseño Dimensional: ¿Cómo crear una tabla de hechos?
Porque es tan importante la dimensión de Fechas
Antes de ver el código creo que es importante rescatar porque se requiere una dimisión de fechas o calendario sobresaliente:
- En la mayoría de las empresas existe un conocimiento tácito sobre los ciclos y la estacionalidad de negocio. Por ejemplo, si trabajas en un hospital, y dependiendo del lugar que vivas, seguro conoces cuando son los picos de nacimientos, de emergencias y de otros tipos de atención. Esta estacionalidad puede capturarse con una buena dimensión de tiempo y así se van a poder evaluar las métricas o medidas, pero en el contexto esta estacionalidad.
- La dimensión de tiempo es una de las dimensiones más usadas, ya que es raro que una tabla de hechos que no tenga una o más relaciones con la tabla de fechas. Esto hace que la tabla de dimensión sea una buena inversión.
- Es poco probable que los usuarios pueden construir una tabla de este tipo, y aun cuando sea posible es recomendable la dimensión de fechas sea conformada. Una dimensión conformada es la dimensión que se define una vez, y se reutiliza en múltiples Datamarts y Tablas de hechos, facilitando la consistencia analítica.
- El tener una dimesión con tantos atributos da el tono para otras dimensiones y le permite a los clientes entender que «entre mejores sean los atributos de la dimensión mas inteligente es el modelo».
Patrones reconocidos en la Dimensión de Fechas
Hay algunos patrones que merecen ser explicados con detalle para entender el código:
- Llave inteligente: tipo entero, con el formato: YYYYMMDD. Entonces 20170402 representa el 2 de abril de 2017. También usar una llave inteligente facilita darle soporte a las tablas de hechos y al mismo tiempo permite agregar valores especiales o fechas inválidas al modelo. Por ejemplo, podemos agregar una fila -1 para fechas erroneas o fuera de rango.
- Atributos en pares Llave-Nombre: Esto se hace por varias razones:
- Permite ordenar los datos por llave y desplegar el nombre. Es poco probable que alguien quiera desplegar los meses de forma alfabética.
- Simplifica las formulas en MDX/DAX.
- Permite extender el modelo a multilenguaje.
- Permite que en los modelos analíticos se use la columna llave para ahorrar espacio y mejorar el desempeño.
- Atributos Cortos y Largos: Para algunos atributos como semanas, meses y trimestres, uso 2 versiones del atributo. Por ejemplo, el mes-largo tiene valores como: Enero-2017, febrero-2017, marzo-2017; por otra parte, el atributo mes-corto tiene valores como: Enero, febrero, marzo, etc.
- El atributo largo se usa para crear jerarquías naturales y porque cuando los usuarios filtran por este atributo los reportes o tablas pivote despliegan el filtro completo lo que es más usable y evita errores.
- El atributo corto se usa principalmente para hacer “dice” de los datos. Este es poner en columnas el año y el mes como filas.
- Atributos Numéricos: Estos atributos se usan para facilitar procesos de cálculos del datamart de métricas derivadas, como por ejemplo obtener promedios diarios (Anual, Trimestral o Mensual). En modelos tabulares se hace directamente de la tabla en modelos multidimensionales se suele construir una vista con la llave y los atributos numéricos.
Mejoras pendientes
Del código me quedan todavía algunos cambios que me gustaría en versiones siguientes usar:
- En algunos clientes uso atributos para facilitar reportes que llevan el año, trimestre, mes y semana actual. De manera que, por ejemplo, para el atributo IsActualMonth (EsMesActual): todos los días del mes actual tienen valor en 1 y todos los demás días en 0. Entonces crear reportes o paneles de mando es mucho más fácil ya que el reporte usa este atributo para filtrar y el reporte dinámicamente se ajusta a las fechas. Estos atributos se actualizan de forma periódica y a veces tienen lógica compleja de negocio, como: se considera el mes actual solo si cierto proceso de cierre ha ocurrido o tiene una ventana de 5 días para “cerrar” el mes.
- La lógica de Business Season (temporada de negocios) está muy alambrada y es propensa a errores. Debo mover esta lógica a un CTE.
Esta tabla puede ayudarte mucho a darle un mayor valor a modelos analíticos, baja el código base de GitHub, de los archivos DIM-010 DateDimesionSchema.sql, DIM-011 HelperFunctions.sql y DIM-012 FillDateDimension.sql y evalua si se adapta a las necesidades de tu organización.
Deja una respuesta