(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisbon

DP-600: implement and optimize date hierarchies by levels

João Barros 05 de November de 2026 4 min read

I will explain how to implement and optimize date hierarchies by levels (year → quarter → month → day) in a Power BI/Fabric semantic model. This skill is important for reports with efficient drill-down and is frequently assessed on the DP-600 exam and useful in real projects for performance and usability.

What you need to know

A date hierarchy by levels organizes temporal fields into structures that allow drill-down and roll-up in reports (for example: Year > Quarter > Month > Day). For the analysis engine (VertiPaq / Fabric), the correct design of the date dimension improves usability and performance: use integer columns for keys, avoid unnecessary high cardinality, ensure uniqueness and sort text columns by numeric columns when necessary.

Example: a Date table with these useful columns:

  • DateKey (int) — format YYYYMMDD, unique and primary key.
  • Date (date) — calendrical value.
  • Year (int), Quarter (int), MonthNumber (int), Day (int).
  • MonthName (string) — displayed, but ordered by MonthNumber.
  • IsHoliday (bool) and fiscal fields if needed.

How it works

Main technical points and reasons:

  • Integer key (DateKey): relationships based on integers are more efficient than on date/time or text.
  • Sorting: text columns used on axes (e.g., "January") should be sorted by a numeric column (MonthNumber) to ensure correct order and compression performance.
  • Physical hierarchy vs. model hierarchy: build the columns and then create the Hierarchy in the semantic model (Power BI Desktop/Model in Fabric). The Hierarchy is a convenience for visuals and does not duplicate data.
  • Avoid heavy calculated columns: whenever possible, generate the Date table columns during the ingestion process (Power Query, Dataflow, Spark) instead of DAX calculations that increase model load time.

In practice

Step-by-step practical guide to create an optimized date hierarchy:

  1. Generate the Date table outside the model (preferable): Power Query / Dataflow / Spark SQL — ensures columns are pre-computed and compacted efficiently.
  2. Define DateKey as integer and Date as type date. DateKey = YEAR(Date) * 10000 + MONTH(Date) * 100 + DAY(Date).
  3. Create columns Year, Quarter, MonthNumber, MonthName, DayOfMonth. For MonthName, keep MonthNumber and then set ordering: order MonthName by MonthNumber.
// Exemplo simples em M (Power Query) para criar MonthNumber e MonthName
let
  Source = List.Dates(#date(2020,1,1), Duration.Days(#date(2023,12,31) - #date(2020,1,1)) + 1, #duration(1,0,0,0)),
  Table = Table.FromList(Source, Splitter.SplitByNothing(), {"Date"}),
  AddDateParts = Table.TransformColumns(Table, {{"Date", DateTime.Date}}),
  AddKeys = Table.AddColumn(AddDateParts, "DateKey", each Date.Year([Date]) * 10000 + Date.Month([Date]) * 100 + Date.Day([Date])),
  AddYear = Table.AddColumn(AddKeys, "Year", each Date.Year([Date])),
  AddMonthNum = Table.AddColumn(AddYear, "MonthNumber", each Date.Month([Date])),
  AddMonthName = Table.AddColumn(AddMonthNum, "MonthName", each Date.ToText([Date], "MMMM")),
  AddQuarter = Table.AddColumn(AddMonthName, "Quarter", each Date.QuarterOfYear([Date]))
in
  AddQuarter

After loading the table into the model:

  • In the model, select the MonthName column and set Order By Column = MonthNumber.
  • Create the Hierarchy: drag Year → Quarter → MonthName → Date (or Day). This hierarchy eases drill-down in visuals.
  • Relate DateKey with fact tables using integers.

Common mistakes

Typical pitfalls to avoid:

  • Using text (e.g., "Jan", "Feb") without setting Order By Column — visuals show alphabetical order, confusing users.
  • Relating by date/time columns with times or time zones, which can prevent matching the granularity of the fact table; prefer integer DateKey or truncate the time.
  • Creating heavy DAX calculated columns for each row instead of pre-computing at ingestion — increases processing time and model size.

How to practice

To train this skill, use the OFFICIAL and free Microsoft Practice Assessment for DP-600 and the official study guide (also free). Both allow you to verify knowledge in semantic modeling and optimization. Do not use dumps; use official resources to practice and measure progress.

In summary

  • Create a Date table with an integer DateKey and level columns (Year, Quarter, MonthNumber, MonthName, Day).
  • Order text columns by numeric columns (MonthName by MonthNumber) to ensure correct presentation and compression.
  • Pre-compute fields at ingestion (Power Query/Dataflow/Spark) for better model performance.
  • Relate fact tables by integer keys and use the model Hierarchy for drill-down without duplicating data.