Zum Hauptinhalt springen

Ich habe in meinen 50 Lebensjahren viel gelernt, und eine meiner größten Erkenntnisse ist das "Egal wie viel Sie bereits wissen, es gibt noch mehr zu lernen". Hoffentlich ist dies einer der Gründe, warum Sie meinen Blog lesen, denn Sie möchten von mir lernen, wir alle lernen voneinander.

Meine regelmäßigen Leser würden wissen, dass es viele Gründe gibt, warum ich gerne teile, was ich in meinem Blog gelernt habe.

  • Ich kann das, was ich weiß, mit anderen teilen.
  • Ich kann mein Denken zu diesem Thema klarstellen (ich komme zu einem tieferen Verständnis, wenn ich es jemand anderem erklären muss). Stephen Covey beschreibt dies als "Lernen der dritten Person"
  • Ich bekomme eine permanente Aufzeichnung darüber, wie ich es selbst mache, damit ich es in Zukunft wiederfinden kann, wenn ich es brauche.
  • Und hoffentlich wird mich irgendwann jemand einstellen, um seine Mitarbeiter zu schulen oder ein Problem zu beheben, das sie haben.

Manchmal (wie diesmal) finde ich, dass jemand das gleiche Problem, das ich in meinem Blog geteilt habe, besser lösen kann. Dies geschah letzte Woche, nachdem ich meinen ersten Artikel über die Berechnung der gesamten Geschäftszeiten zwischen zwei Datums- / Zeitstempeln veröffentlicht hatte. Ich teilte mit, wie ich dieses Problem letzte Woche gelöst habe, aber einer meiner Leser, Daniil Bogomazov, teilte eine brillante Problemumgehung für dasselbe Problem. Die Lösung ist so gut, dass ich heute ihre Lösung mit Ihnen teile.

Aber was ist mit der Lösung der letzten Woche?

Die Lösung, die ich letzte Woche bereitgestellt habe, ist eine gültige Lösung (es gibt mehr als einen Weg, eine Katze zu häuten). Darüber hinaus ging es im Blog der letzten Woche auch um der Prozess der Lösung eines Problems eher als die spezifische resultierende Formel selbst. Ich bin der festen Überzeugung, dass Sie ein besserer DAX-Autor sind, wenn ich Ihnen helfen kann, den Prozess zu verstehen. Hinweis: Ich habe letzte Woche einige Kommentare erhalten, dass ich einen logischen Fehler in meiner Formel gemacht habe. Ich muss es reparieren :-).

DAX ist eine schöne Sprache

Die Lösung, die ich unten teilen werde, ist buchstäblich schön. DAX ist (oder sollte ich sagen, kann es sein) eine schöne und elegante Sprache. Sobald Sie die zugrunde liegenden Prinzipien der Funktionsweise der Sprache verstanden haben, können Sie buchstäblich ausgefallene Formeln schreiben, die die Stärken des Datenmodells nutzen, um die benötigte Zahl zurückzugeben. Lassen Sie mich Ihnen die von Daniil bereitgestellte Formel zeigen und dann einige Zeit damit verbringen, zu erklären, wie es funktioniert.

igraal_de-de

Schön und kompakt, findest du nicht?

Warum ist es so anders?

Sie fragen sich vielleicht, warum sich diese Lösung von meiner Lösung aus der letzten Woche unterscheidet. Ich habe darüber nachgedacht und ich denke, das liegt daran, dass Daniil das Problem anders angegangen ist als ich. Sie können sich im Video von letzter Woche daran erinnern, dass ich die folgende Abbildung verwendet habe, um über das Problem nachzudenken.

Ich habe das Problem in Teile zerlegt und für jedes Puzzleteil eine Lösung erstellt (erster Tag / Teiltag + letzter Tag / Teiltag + volle Tage dazwischen). Mir fällt ein, dass Daniil das Problem anders gesehen hat. Ich dachte: "Ich muss jeden Arbeitstag einzeln durchstehen und berechnen, wie viele Stunden pro Tag." Es ist eine andere Denkweise und vor allem spielt direkt mit den Stärken der DAX-Sprache. DAX ist in zwei Bereichen sehr stark: Filtern von Tabellen und Durchlaufen von Zeilen in Tabellen. Der Denkprozess von Daniil spielt also direkt in die Stärken von DAX ein - das ist für uns alle eine Lehre. Wenn Sie wie die Engine denken können, schreiben Sie einen besseren DAX.

Unterschiede in Daniils Modell gegenüber meinem

Bevor ich diese Lösung erkläre, sollte ich darauf hinweisen, dass Daniil die offenen und letzten Spalten der Tickets nicht in separate Datums- und Zeitspalten aufgeteilt hat. Stattdessen wurden sie als zusammengeführte Datums- / Zeitspalten beibehalten.

Dies ist erforderlich, damit diese Lösung funktioniert, da Datum und Uhrzeit Teil der Lösung sind. Im Allgemeinen ist es nicht empfehlenswert, Daten in Datums- / Zeitspalten zu laden, und es wird im Allgemeinen empfohlen, sie in Bestandteile zu unterteilen. Es wäre definitiv möglich, die Spalten zu teilen (Best Practice) und dann das Datum / die Uhrzeit (wie von dieser Lösung gefordert) innerhalb der DAX-Kennzahl neu zu erstellen. Wenn Größe und Leistung in der Produktion ein Problem darstellen würden, würde ich dies definitiv in Betracht ziehen. Ich habe Ihnen am Ende dieser Seite gezeigt, wie.

Das zweite, was zu beachten ist, ist, dass es in diesem Modell keine Beziehungen gibt.

Dies ist sinnvoll, wenn Sie darüber nachdenken, da die Primärschlüsselspalte der Kalendertabelle vom Typ "Datum" ist und die HelpDeskTickets-Tabelle Datum / Uhrzeit ist. Daher können sie nicht verbunden werden (in allen Modi nicht sinnvoll). Der letzte Unterschied besteht darin, dass Daniil das Start- und Enddatum / die Endzeit für die Geschäftszeiten in jeder Zeile der Kalendertabelle fest codiert hat. Dies hat den zusätzlichen Vorteil, dass bei Bedarf die Möglichkeit unterschiedlicher Geschäftszeiten an unterschiedlichen Tagen effektiv unterstützt wird. In meiner alternativen Formel am Ende der Seite müssen Sie sie nicht als Datums- / Zeitspalten speichern (Best Practice erneut).

Lassen Sie mich die Formel für Sie unten aufschlüsseln

Wie so oft in der DAX-Sprache müssen Sie mitten in einer Formel beginnen, um herauszufinden, was sie bewirkt. Tatsächlich kommt es häufig vor, dass DAX-Formeln von innen nach außen geschrieben werden. Dies gilt insbesondere für diese Art von Lösung, die Tabellen, iterative Funktionen und berechnete Spalten verwendet.

Lassen Sie mich mit den Zeilen 6-10 beginnen (siehe unten)

In diesem Abschnitt wird eine Kopie der Kalendertabelle erstellt, wobei nur Werktage beibehalten werden (Zeilen 6, 7 und 9 tun dies). Zeile 8 übergibt einen zusätzlichen Filter an die Kalendertabelle für jedes Ticket in der HelpTickets-Tabelle, wobei nur die Zeilen in der Kalendertabelle beibehalten werden, die sich über die Tage erstrecken, an denen das Ticket geöffnet war. Die Zeilen 6 bis 9 erledigen diese Aufgabe Ticket für Ticket (lassen Sie uns in Kürze darauf zurückkommen). Jetzt sagte ich "Kopie" der Kalendertabelle oben, aber Sie können "denken" dieser Formel auf eine von 2 verschiedenen Arten arbeiten. Stellen Sie sich eine virtuelle Kopie der Tabelle vor, die die Abstammung bis zur ursprünglichen Kalendertabelle enthält, oder Sie können sich die ursprüngliche Kalendertabelle im Modell vorstellen, die direkt gefiltert wird. Beide Denkansätze haben den gleichen Effekt: Die Kalendertabelle enthält nur die Tage, an denen Sie zum Zeitpunkt Ihrer Verwendung interessiert sind. Dies ist eine Liste von Geschäftstagen, die sich über den Zeitraum erstrecken, in dem das Ticket geöffnet ist. Da es sich bei dieser Formel um eine berechnete Spalte handelt, ist es die Iteration der berechneten Spalte, die jedes HelpTicket zeilenweise an diesen Teil der Formel übergibt. Sie können sich also "vorstellen", dass jede Zeile in der berechneten Spalte eine eigene "Teilmenge" der Kalendertabelle hat, die speziell für die Verwendung im nächsten Teil der Formel gefiltert wurde.

Zeile 5 ist eine Zusammenfassung in dieser Tabelle

Zeile 5 (und die entsprechende schließende Klammer in Zeile 12) ist also die iterative Funktion. SUMX durchläuft die zuvor erstellte gefilterte Kalendertabelle und schließt dann die in Zeile 11 gezeigte Berechnung für jede Zeile in der gefilterten Kalendertabelle ab. Dieser SUMX-Iterator durchläuft die nach Teilmengen gefilterte Kalendertabelle zeilenweise, um die Gesamtgeschäftszeit für jedes Ticket zu berechnen.

Schauen wir uns also Zeile 11 im Detail an.

Dies ist eine ziemlich komplizierte Codezeile, aber wenn Sie sie aufschlüsseln, ist die Logik ziemlich einfach.

Beginnend mit Teil 2 (oben) heißt es: „Welches Datum / welche Uhrzeit ist größer? Ist es die Startzeit in der Kalendertabelle (für diese Zeile, die ich mir ansehe) oder ist es die Startzeit in der Ticket-Tabelle? Wenn ich meine Darstellung der Wochentage in einer Woche meine, heißt es: „Je nachdem, was zuerst eintritt, 1 oder 2 (im Bild unten). Mit anderen Worten, wurde das Ticket an diesem Tag vor oder nach Beginn der Geschäftszeiten geöffnet? Behalten Sie den letzten mit der MAX-Funktion.

Zurück zur ursprünglichen Formel (der Einfachheit halber unten noch einmal gezeigt) ...

In Teil 1 der obigen Formel lautet die Frage: „Was kommt zuerst? das Schließen des Tickets (3 in der vorherigen Zeitleiste) oder das Ende des Geschäftstages (4 in der Zeitleiste angezeigt) “?

Jetzt ist Zeile 11 ziemlich schlau, denn wenn es der erste oder der letzte Tag des Tickets ist, wird der „Teiltag“ bei Bedarf korrekt behandelt. Für alle anderen Tage werden die vollen Geschäftszeiten für diesen Tag korrekt berechnet.

Endlich meine modifizierte Version

Wie ich bereits erwähnte, kann sein Es ist vorteilhaft, die Datums- / Zeitspalten in größere Modelle aufzuteilen (dies hätte keine wesentlichen Auswirkungen auf ein so kleines Modell, kann jedoch größeren Modellen zugute kommen). Ich habe der Vollständigkeit halber eine modifizierte Version hinzugefügt, und Sie können sehen, dass Sie die Datums- / Zeitstempel in der Formel nach Bedarf einfach neu erstellen können.

Dies ist eine allgemeine Technik, die Sie für jede Datums- / Zeitspalte verwenden können. Sie sollten immer den zusätzlichen Aufwand der Engine berücksichtigen, um die Spalten wieder zusammenzusetzen, sowie den etwas komplexeren DAX im Vergleich zum Vorteil der Speicherplatzersparnis.

Ich habe die Arbeitsmappe hier angehängt, wenn Sie sie sich ansehen möchten.

Error: Beachtung: Geschützter Inhalt.