DP-600: implementar tablas de tiempo (date tables) eficientes
Voy a explicar cómo implementar una tabla de tiempo (date table) eficiente en un modelo semántico para Power BI/Fabric — una competencia habitual en el DP-600. Las tablas de tiempo bien diseñadas son críticas para análisis temporales, rendimiento de medidas y funcionalidades como time intelligence.
Lo que necesitas saber
Una tabla de tiempo (date table) es una tabla dedicada que contiene una fila por día (u otra granularidad) y columnas con atributos temporales: año, trimestre, mes, día de la semana, indicadores de fin de semana, trimestres fiscales, periodos móviles de 12 meses, etc. En el contexto del DP-600 es importante porque:
- Permite usar funciones de time intelligence correctamente (por ejemplo DAX CALCULATE con DATEADD, SAMEPERIODLASTYEAR).
- Mejora la claridad del modelo y el rendimiento cuando está bien indexada y enlazada por claves del tipo date.
- Soporta filtros relativos, agrupaciones y jerarquías temporales que los informes requieren.
Ejemplo simple: una tabla Date con columnas DateKey (YYYYMMDD int), Date (date), Year, MonthNumber, MonthName, Quarter, IsWeekend, FiscalMonth, FiscalYear, YearMonth (YYYY-MM) y una clave primaria en la columna Date.
En la práctica: pasos para crear e integrar una date table
Paso 1 — Elegir granularidad y alcance
Decide si la granularidad será diaria (más común) u otra. Define el intervalo de fechas en función de los datos: por ejemplo, desde la primera Date en las fact tables hasta la fecha actual + 1 año para planificación. Evita crear intervalos excesivamente amplios (años innecesarios) para no inflar el modelo.
Paso 2 — Generar la tabla (ejemplo en Power Query / M)
// Exemplo M para criar uma date table diária
let
StartDate = #date(2018,1,1),
EndDate = Date.AddYears(Date.From(DateTimeZone.FixedUtcNow()), 1),
DayCount = Duration.Days(EndDate - StartDate) + 1,
Source = List.Dates(StartDate, DayCount, #duration(1,0,0,0)),
TableFromList = Table.FromList(Source, Splitter.SplitByNothing(), {"Date"}),
ChangedType = Table.TransformColumnTypes(TableFromList, {{"Date", type date}}),
AddColumns = Table.TransformColumns(ChangedType, {}, (r) => r),
AddAttrs = Table.TransformColumns(AddColumns, {}, (r) => r),
AddFields = Table.AddColumn(AddCols, "Year", each Date.Year([Date]))
in
AddFields
Notas: ajusta el script para incluir columnas MonthNumber, MonthName, Quarter, WeekOfYear, IsWeekend, FiscalMonth/Year. También puedes usar DAX (CALENDAR/CALENDARAUTO) para crear tablas de fecha en el propio modelo o usar soluciones automáticas de Fabric.
Paso 3 — Marcar como Date Table
Tras cargar la tabla en el modelo, márcala explícitamente como Date Table (Model view → Mark as Date Table) y elige la columna de fecha. Esto garantiza que las funciones de time intelligence usen esa tabla correctamente.
Paso 4 — Enlazar con las fact tables
Crea relaciones 1:* entre la columna Date de la date table y las columnas de fecha en las fact tables (por ejemplo OrderDate, ShipDate). Mantén las relaciones activas y con dirección adecuada (single cross filter generalmente). Evita enlazar fact tables por columnas de fecha distintas sin crear múltiples relaciones o usar role-playing date tables cuando sea necesario.
Paso 5 — Optimización de rendimiento
- Usa tipos de datos compactos: date en lugar de datetime cuando sea posible; columnas clave enteras (DateKey) para reducir espacio y acelerar joins.
- Crea columnas calculadas estáticas durante el proceso de ETL/Power Query en lugar de DAX cuando sea posible — evita cálculo repetido en tiempo de ejecución.
- Elimina columnas redundantes e indexa/define clave primaria a nivel de la fuente cuando uses DirectQuery sobre una base externa.
Errores comunes
1) No marcar la tabla como Date Table: conduce a resultados erróneos con funciones de time intelligence y a incompatibilidades con DAX.
2) Intervalo de fechas demasiado pequeño o demasiado amplio: demasiado corto impide análisis históricos; demasiado largo aumenta el tamaño del modelo y afecta al rendimiento.
3) Enlazar múltiples fact tables sin role-playing o sin gestionar relaciones inactivas: puede causar ambigüedad en los filtros y resultados inesperados en medidas.
Cómo practicar
Practica creando varias date tables para escenarios diferentes: calendario fiscal con inicio en mes arbitrario, tablas role-playing (OrderDate vs ShipDate) y tablas con granularidad mensual. Usa conjuntos de datos de ejemplo (AdventureWorks, WideWorldImporters) e implementa las columnas necesarias vía Power Query y DAX.
Para entrenamiento oficial, usa el Practice Assessment OFICIAL gratuito de Microsoft y la study guide de la certificación DP-600 (ambos gratuitos) — estos recursos ayudan a verificar que cubres las skills measured sin recurrir a material prohibido.
En resumen
- Una date table bien diseñada es esencial para time intelligence y el rendimiento del modelo.
- Genera la tabla con el intervalo correcto, incluye columnas útiles (Year, Month, Fiscal) y márcala como Date Table.
- Enlaza correctamente con las fact tables (role-playing cuando sea necesario) y optimiza con tipos compactos y pre-cálculo en ETL.
- Practica con datasets reales y valida los conocimientos con el Practice Assessment oficial y la study guide de Microsoft.