DP-600: implementar tabelas de tempo (date tables) eficientes
Vou ensinar como implementar uma tabela de tempo (date table) eficiente num modelo semântico para Power BI/Fabric — uma competência comum no DP-600. Tabelas de tempo bem concebidas são críticas para análises temporais, desempenho de medidas e funcionalidades como time intelligence.
O que precisas de saber
Uma tabela de tempo (date table) é uma tabela dedicada que contém uma linha por dia (ou outra granularidade) e colunas com atributos temporais: ano, trimestre, mês, dia da semana, flags de fim de semana, trimestres fiscais, períodos móveis de 12 meses, etc. No contexto do DP-600 importa porque:
- Permite usar funções de time intelligence corretamente (por exemplo DAX CALCULATE com DATEADD, SAMEPERIODLASTYEAR).
- Melhora a clareza do modelo e o desempenho quando bem indexada e ligada por chaves do tipo date.
- Suporta filtros relativos, agrupamentos e hierarquias temporais que os relatórios exigem.
Exemplo simples: uma tabela Date com colunas DateKey (YYYYMMDD int), Date (date), Year, MonthNumber, MonthName, Quarter, IsWeekend, FiscalMonth, FiscalYear, YearMonth (YYYY-MM) e uma chave primária na coluna Date.
Na prática: passos para criar e integrar uma date table
Passo 1 — Escolher granularidade e âmbito
Decide se a granularidade será diária (mais comum) ou outra. Define o intervalo de datas com base nos dados: por exemplo, desde o primeiro Date nas fact tables até à data actual + 1 ano para planeamento. Evita criar intervalos demasiado amplos (anos desnecessários) para não inflacionar o modelo.
Passo 2 — Gerar a tabela (exemplo em 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 o script para incluir colunas MonthNumber, MonthName, Quarter, WeekOfYear, IsWeekend, FiscalMonth/Year. Podes também usar DAX (CALENDAR/CALENDARAUTO) para criar tabelas de data no próprio modelo ou usar soluções automáticas do Fabric.
Passo 3 — Marcar como Date Table
Depois de carregar a tabela no modelo, marca-a explicitamente como Date Table (Model view → Mark as Date Table) e escolhe a coluna de data. Isto garante que as funções de time intelligence usam essa tabela correctamente.
Passo 4 — Ligar às fact tables
Cria relações 1:* entre a coluna Date da date table e as colunas de data nas fact tables (por exemplo OrderDate, ShipDate). Mantém as relações activas e com direcção adequada (single cross filter geralmente). Evita ligar fact tables por colunas de data diferentes sem criar múltiplas relações ou usar role-playing date tables quando necessário.
Passo 5 — Optimização de desempenho
- Usa tipos de dados compactos: date em vez de datetime quando possível; colunas chave inteiras (DateKey) para reduzir espaço e acelerar joins.
- Cria colunas calculadas estáticas durante o processo de ETL/Power Query em vez de DAX quando possível — evita cálculo repetido em tempo de execução.
- Remove colunas redundantes e indexa/chave primária ao nível da fonte quando uses DirectQuery sobre uma base externa.
Erros comuns
1) Não marcar a tabela como Date Table: leva a resultados errados com funções de time intelligence e a incompatibilidades com DAX.
2) Intervalo de datas demasiado pequeno ou demasiado amplo: curto demais impede análises históricas; longo demais aumenta o tamanho do modelo e afecta o desempenho.
3) Ligar múltiplas fact tables sem role-playing ou sem gerir relações inactivas: pode causar ambiguidade nos filtros e resultados inesperados em medidas.
Como praticar
Pratica criando várias date tables para cenários diferentes: calendário fiscal com início em mês arbitrário, tabelas role-playing (OrderDate vs ShipDate) e tabelas com granularidade mensal. Usa conjuntos de dados de exemplo (AdventureWorks, WideWorldImporters) e implementa as colunas necessárias via Power Query e DAX.
Para treino oficial, usa o Practice Assessment OFICIAL gratuito da Microsoft e a study guide da certificação DP-600 (ambos gratuitos) — estes recursos ajudam a verificar que cobres as skills measured sem recorrer a material proibido.
Em resumo
- Uma date table bem desenhada é essencial para time intelligence e desempenho do modelo.
- Gera a tabela com o intervalo correcto, inclui colunas úteis (Year, Month, Fiscal) e marca-a como Date Table.
- Liga correctamente às fact tables (role-playing quando necessário) e optimiza com tipos compactos e pré-cálculo em ETL.
- Pratica com datasets reais e valida os conhecimentos com o Practice Assessment oficial e a study guide da Microsoft.