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 Anwendungsentwickler für Business Intelligence und erstellt Lösungen, mit denen sich große Datenmengen schnell analysieren lassen. Kunden nutzen seine Lösungen, um die Vergangenheit zu analysieren, die Gegenwart zu steuern und die Zukunft zu planen, um damit mehr Erfolg zu generieren. Dabei ist seine einzigartige Kombination aus Wissen und Auffassungsgabe ein Garant für ihren Erfolg.

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.