ISO 8601 Kalenderwoche in Power Query mit SQL Query Folding berechnen

Wer im Internet nach einer Berechnung der ISO-Kalenderwoche in Power Query sucht, findet häufig eine Benutzerdefinierte Funktion, die diesen Job erledigt. Doch leider unterbricht die Benutzerdefinierte Funktion das Query Folding bei SQL-Datenquellen, womit meistens der Ladeprozess verlangsamt wird. In diesen Beitrag stelle ich eine Lösung bereit, die auch das Query Folding für SQL-Datenquellen unterstützt.

Die entsprechende Berechnung basiert auf dem Blogbeitrag „A Simple Formula to Calculate the ISO Week Number“ von Jeff Moden, die ich auf SQL Server Query Folding fähige Transformationen übersetzt habe.

Um die Anwendungsschritte nicht unnötig aufzublasen, habe ich alle Transformationen in einen Anwendungsschritt zusammengefasst.

Um den Anwendungsschritt in die eigene Abfrage zu übernehmen, müssen die Zeilen 5 – 23 kopiert und über den erweiterten Editor in die eigene Abfrage eingefügt werden. In Zeile 11 muss der Anwendungsschrittname „dbo_FactSales“ und der Datumspaltenname „Datekey“ auf den entsprechenden Anwendungsschrittnamen und Datumspaltennamen der Abfrage angepasst werden. Dabei muss die Datumspalte vom Datentyp Datum oder Datum/Uhrzeit sein.

let
  Quelle = Sql.Databases(".", [CreateNavigationProperties = false]), 
  ContosoRetailDW_SQLBI = Quelle{[Name = "ContosoRetailDW_SQLBI"]}[Data], 
  dbo_FactSales = ContosoRetailDW_SQLBI{[Schema = "dbo", Item = "FactSales"]}[Data], 
  IsoWeek = Table.TransformColumns(
    Table.TransformColumns(
      Table.TransformColumnTypes(
        Table.TransformColumns(
          Table.TransformColumns(
            Table.TransformColumnTypes(
              Table.DuplicateColumn(dbo_FactSales, "DateKey", "IsoWeek"), 
              {{"IsoWeek", Int64.Type}}
            ), 
            {{"IsoWeek", each _ + 53688, type number}}
          ), 
          {{"IsoWeek", each _ - Number.Mod(_, 7) - 53685, type number}}
        ), 
        {{"IsoWeek", type date}}
      ), 
      {{"IsoWeek", Date.DayOfYear, Int64.Type}}
    ), 
    {{"IsoWeek", each Number.RoundDown(_ + 6 / 7), Int64.Type}}
  )
in
  IsoWeek

Performancevergleich

Bei einem ersten Performancevergleich der Berechnung der ISO-Kalenderwoche mittels einer Power Query Funktion (Rot) im Vergleich zu der Query Folding Lösung (Grün), war die Query Folding Lösung bei ca. 3,4 Millionen Zeilen (FactSales der ContosoRetailDW) ca. 1 Minute schneller.

Performance Vergleich Power Query Funktion vs. Query Folding
Performancevergleich zwischen Power Query Funktion (Rot) und Query Folding Lösung (Grün)

Quellen:
https://www.sqlservercentral.com/articles/a-simple-formula-to-calculate-the-iso-week-number
https://whatthefact.bi/de/power-bi/power-query-m/iso-8601-kalenderwoche-in-power-query-berechnen/

Veröffentlicht von

Marcus Wegener

Marcus Wegener

Marcus Wegener ist Full Stack Power BI & Fabric Engineer und schreibt auf thinkBI über Datenmodellierung, Power BI, Fabric und Business Intelligence als Grundlage besserer Entscheidungen. Im Zentrum steht nicht das Dashboard, sondern die Frage, wie aus fachlichen Anforderungen tragfähige Informationsstrukturen entstehen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

I accept that my given data and my IP address is sent to a server in the USA only for the purpose of spam prevention through the Akismet program.More information on Akismet and GDPR.