So speichern und laden Sie eine RDS-Datei in R
Sie erfahren, wie Sie Objekte aus einer .rds-Datei in R speichern und laden. In diesem Blog wird auch behandelt, wie Sie Objekte aus R in LuckyTemplates importieren.
In diesem Tutorial werfen wir einen Blick auf einen Teil des DAX-Codes. Möglicherweise haben Sie so etwas bereits verwendet. Oder Sie stoßen darauf und sind verwirrt darüber, wie dieser Code funktioniert und wie Zeilenkontext und Filterkontext in nur einem einzigen DAX-Code miteinander zu interagieren scheinen. Wie dem auch sei, in diesem Tutorial werden alle oben genannten Punkte im Detail behandelt. Das vollständige Video dieses Tutorials können Sie unten in diesem Blog ansehen.
Zuerst schauen wir uns den Code selbst an. Anschließend gehen wir den theoretischen Teil durch, um ihn besser zu verstehen. Abschließend werfen wir mithilfe von DAX Studio einen Blick hinter die Kulissen .
Das Datenmodell, das wir verwenden werden, ist im Grunde ein einfaches Verkaufsdatenmodell, das Termine, Verkäufe und die Produkttabelle enthält. Die Verkaufstabelle enthält Transaktionen für jeden bestimmten Tag. Die Tabelle „Produkte“ enthält Informationen zu den Verkaufsinformationen der Produkte an jedem bestimmten Tag. Für die Zwecke dieses Tutorials enthält die Datumstabelle nur wenige Spalten.
Uns interessiert nur die Tabelle „Dates“, aber wir werden die Tabelle „Sales“ und die Tabelle „Products“ verwenden, um zu erklären, wie sich der Filterkontext und der Zeilenkontext mithilfe von Beziehungen verbreiten.
Inhaltsverzeichnis
Zeilenkontext und Filterkontext in einer laufenden Gesamtkennzahl
Erstellen wir nun eine laufende Summenkennzahl, da diese sowohl Zeilen- als auch Filterkontexte enthält. Dies ist ein grundlegendes Maß für die laufende Gesamtsumme, bei dem ich COUNTROWS über dem FILTER und die ALL-Funktion verwende, um alle Jahre zurückzugeben, die ich in der Datumstabelle habe. Wenn ich diese Kennzahl in die Tabelle unten einfüge, können Sie sehen, dass wir das erwartete Ergebnis erhalten.
Versuchen wir nun zu analysieren, wie dieser DAX-Code funktioniert.
In der Kennzahl sehen Sie zunächst, dass wir COUNTROWS haben, aber das ist nicht die erste Funktion, die ausgewertet oder ausgeführt wird. Dann haben wir die Funktion FILTER und dann die Funktion ALL. Das erste in der Bewertungsreihenfolge ist ALLES. ALL gibt alle eindeutigen Werte der Datums-Kalender-Jahreszahl zurück, indem alle Filterkontexte ignoriert werden, die außerhalb der ALL-Funktion vorhanden sind.
In den Metriken haben wir also die Spalte „Kalenderjahrnummer“, und diese Spalte wird aktiv gefiltert. Da jedoch ALL den vorhandenen Filterkontext ignoriert, erhalten wir alle eindeutigen Werte dieser Spalte.
Im zweiten Argument im Zeilenkontext haben wir geschrieben, dass die Jahreszahl des Dates-Kalenders kleiner sein sollte als die Zahl des Kalenderjahres von MAX Dates. Wenn Sie nun ein Anfänger sind und immer noch versuchen, DAX zu verstehen und zu lernen, denken Sie vielleicht, dass sowohl die Referenzen auf der linken Seite als auch innerhalb der MAX-Funktion zur selben Spalte gehören und dieselbe Tabelle sind, die wir in der haben ALLE Funktion.
Aber das stimmt nicht. Der einzige Teil des Zeilenkontexts, der zur ALL-Funktion gehört, ist der, den wir auf der linken Seite haben. Das, was wir auf dem MAX haben, wird innerhalb eines Filterkontexts und nicht im Zeilenkontext ausgewertet.
FILTER versucht also, einen Zeilenkontext für die Tabelle zu erstellen, die Sie im ersten Argument angeben, und dieser Teil des Codes wird tatsächlich aus diesem bestimmten Zeilenkontext abgerufen. FILTER iteriert also in jeder Zeile die Tabelle, die wir in ALL haben, und dann können wir auf alle Werte zugreifen, die wir gerade iterieren.
In der ersten Iteration haben wir also nur einen Wert. In der zweiten Iteration haben wir den zweiten Wert. Aber wenn wir MAX schreiben, ist es unabhängig vom Zeilenkontext, den wir mit der FILTER-Funktion erstellen. MAX wird also im Filterkontext ausgewertet, der durch die aktuelle Jahreszahl erstellt wird, die wir in dieser Matrix verwendet haben.
Wenn wir bei 2006 sind, gibt MAX 2006 zurück, während die aktuelle Zeile 2006, 2007 oder 2008 sein kann. FILTER wird die Tabelle zurückgeben, die die Kriterien erfüllt, die wir im zweiten Argument angeben. Wenn wir zu 2007 wechseln, wird MAX 2007 zurückgeben. Im Jahr 2008 wird es 2008 zurückgeben. Und abhängig von allen Werten, die kleiner sind als der von der MAX-Funktion zurückgegebene Wert, wird FILTER a zurückgeben Tisch.
Um zu beweisen, dass MAX nicht vom Zeilenkontext abhängt, können wir diesen Teil des DAX-Codes in mehrere Variablen aufteilen. Und dann können wir verstehen, dass die Spaltenreferenzen auf der linken und rechten Seite nicht identisch sind.
Erstellen wir also eine Variable.
Wie Sie in der Kennzahl unten sehen können, habe ich drei Variablen ( ) erstellt. Anschließend habe ich den FILTER-Code zuletzt mit einer Variablen Result hinzugefügt, die COUNTROWS verwendet . Wenn ich diese Kennzahl in der folgenden Tabelle verwende, werden Sie feststellen, dass sich nichts ändert. Die Ergebnisse sind immer noch die gleichen. Wir erhalten immer noch die gleiche Gesamtsumme wie zuvor.
Wenn wir zum Code zurückkehren und versuchen, den Wert der ersten Variablen abzurufen und dies zu bestätigen, sehen Sie, dass wir für jede Zeile das gleiche Jahr erhalten.
Hoffentlich konnte ich Ihnen also erklären, dass die MAX-Funktion in diesem speziellen Code nicht wirklich vom tatsächlichen Kontext für ihre Werte abhängt. Und wenn Sie Ihr Verständnis des Auswertungskontexts vereinfachen möchten, können Sie den Code jederzeit in mehrere Variablen aufteilen, damit Sie die Auswertungsreihenfolge und die Ausführung des Codes nachvollziehen können.
Jetzt möchte ich Ihnen ein Szenario zeigen , in dem die MAX-Funktion vom Zeilenkontext abhängt , der von der FILTER-Funktion erstellt wird.
Kehren wir also zu dieser Maßnahme zurück. Lassen Sie uns das duplizieren, und anstelle von „Letztes sichtbares Jahr“ habe ich „ MAX. Daten Kalenderjahrnummer“. Wenn ich das in die Matrix einfüge, sehen Sie, dass wir eine Leerstelle erhalten.
Warum?
Die Sache ist, dass wir all die Jahre iterieren und CALCULATE die aktuell iterierte Zeile in einen äquivalenten Filterkontext konvertiert.
Wenn ich hier ein Gleichheitszeichen schreibe, sehen Sie, dass wir sieben, sieben und sieben erhalten.
Warum?
Lassen Sie mich eine neue berechnete Tabelle erstellen, damit Sie leicht verstehen können, was passiert.
Ich werde eine neue Tabelle erstellen. Als Nächstes schreibe ich über die Kalenderjahrnummer „ALL Dates“. Dann schreibe ich „Max. Jahr“ und verwende dann CALCULATE über dem MAX der Datums-Kalenderjahrnummer. Und jetzt können Sie sehen, dass wir für jede Zeile denselben Wert wiederholen.
Da diese Zahlen nicht unbedingt kleiner als sie selbst sind, erhalten wir ein Leerzeichen. Wenn wir jedoch gleich (=) verwenden, sagen wir, dass alle Werte, die kleiner als 2011 sind, eine Sieben erhalten.
Darüber hinaus funktioniert dieser Code nicht, selbst wenn Sie eine Maßreferenz wie etwa „Max Year“ verwenden.
Wenn ich auf „Bestätigen“ klicke, sehen Sie, dass wir immer noch nichts erhalten. Das liegt daran, dass wir, wenn wir „Max Year“ schreiben, einfach „CALCULATE MAX Dates Calendar Year Number“ schreiben.
Eine Maßreferenz enthält immer ein CALCULATE außerhalb davon. Diese Maßnahme initiiert also einen Kontextübergang, der die aktuell iterierte Zeile in einen Filterkontext umwandelt.
Wenn Sie jedoch gebunden sind und eine Kennzahlreferenz verwenden müssen, können Sie diese Kennzahl in einer Variablen speichern. Und wie Sie vielleicht wissen, sind Variablen konstant und können keinen Kontextübergang erzeugen. Daher kann der Zeilenkontext nicht in einen Filterkontext umgewandelt werden.
Das ist also eine kurze Demonstration, wie ein Zeilenkontext und ein Filterkontext in einem DAX-Code miteinander interagieren.
Gehen wir nun zu DAX Studio, um zu verstehen, was sich hinter den Kulissen abspielt.
Verwenden von DAX Studio zum Verstehen des Zeilenkontexts und des Filterkontexts
Gehen wir zu den externen Tools und starten Sie DAX Studio. Wir müssen mithilfe des Abfrageplans und der Server-Timings eine Verbindung zur LuckyTemplates-Datei herstellen .
Dann werde ich eine Abfragekennzahl erstellen. Ich schreibe DEFINE MEASURE in die Datumstabelle, Dates Running Total. Und dann werde ich den ursprünglichen Code verwenden, den wir hatten.
Da wir eine Tabelle zurückgeben sollen, können wir EVALUATE schreiben. Zum Schluss erstellen wir die Tabelle mit SUMMARIZECOLUMNS. Wir schreiben also die Datumsangaben, die Jahreszahl des Kalenders und die virtuelle Spalte, die die laufende Summe darstellt. Und dann kann ich so etwas wie DT als DAX Studio-Schlüsselwort schreiben.
Wenn ich diesen Code ausführe, können Sie sehen, dass der Code vollständig ist und wir immer noch das gleiche Ergebnis erhalten, das wir in LuckyTemplates gesehen haben.
Gehen wir nun zum Abfrageplan, um zu verstehen, was sich hinter den Kulissen abspielt. Mal sehen, ob die MAX-Funktion tatsächlich vom Zeilenkontext abhängig ist oder nicht. Gehen wir zum logischen Abfrageplan über, da der physische Abfrageplan im Allgemeinen komplexer und etwas schwieriger zu lesen ist.
Sie können sehen, dass der erste Operator in der ersten Zeile GroupSemiJoin ist und von SUMMARIZECOLUMNS verwendet wird, um eine innere Verbindung zwischen zwei Spalten zu erstellen.
Zum Verbinden dieser Spalten gibt es dann Scan_Vertipaq , die Speicher-Engine, die wir in den Analysediensten haben. Wir können sehen, dass dort steht, dass wir eine Spalte benötigen, nämlich Datumsangaben, Kalenderjahresnummer. In LuckyTemplates können Sie sehen, dass wir in der Matrix diese Spalte „Kalenderjahrnummer“ haben, die als Zugriff auf unseren Bericht dient.
Als nächstes haben wir die COUNTROWS-Funktion in unserer Messung als Operator der obersten Ebene, dann ruft COUNTROWS die FILTER-Funktion für den Filter auf. Es gibt wieder einen Scan_Vertipaq , der besagt, dass RequiredCols die Jahreszahl des Datumskalenders ist.
Die Zeilen 2 und 5 sind gleich, aber der erste Scan_Vertipaq ist mit Null markiert, während der zweite mit Eins gekennzeichnet ist. Das bedeutet, dass die Spalte, auf die wir mit Hilfe der ALL-Funktion zugreifen, separat von der Spalte extrahiert wird, die wir in der SUMMARIZECOLUMNS-Funktion haben.
Dann gibt es einen LessThan- Operator. In der nächsten Zeile sehen wir, dass es einen Vergleich zwischen dem Zeilenkontext und der MAX-Funktion gibt .
Darauf folgt der Max_Vertipaq . Wir extrahieren also tatsächlich den Max-Wert aus der Speicher-Engine. Auf der rechten Seite sehen Sie, dass dort „DependOnCols Dates Calendar Year Number“ steht. Das ist das Wichtigste, woran wir uns erinnern müssen. Vorhin habe ich gesagt, dass es keine Abhängigkeit der MAX-Funktion vom Zeilenkontext gibt, und das ist es, was es tatsächlich beweist.
Und so steht hier Null.
Wo haben wir Null gefunden?
Oben (die zweite Zeile), die für SUMMARIZECOLUMNS extrahiert wird. Das bedeutet, dass die MAX-Funktion nicht vom Zeilenkontext abhängt, sondern tatsächlich von der Spalte (Kalenderjahrnummer), die wir in dieser Tabelle haben. Diese Tabelle erstellt also tatsächlich den Filterkontext.
Kurz gesagt, die MAX-Funktion ist vom Filterkontext und nicht vom Zeilenkontext abhängig.
Als Nächstes können Sie sehen, dass wir für die Berechnung von Max_Vertipaq einen Scan_Vertipaq haben , der besagt, dass DependOnCols null (0) Datum, Kalender, Jahreszahl ist. Und dann gibt es noch mehrere andere Spalten, die Spalten erfordern.
Schauen wir uns nun die variable Version des Codes an. Anstatt LastVisibleYear zurückzugeben, werde ich die COUNTROWS-Version oder die Ergebnisvariable zurückgeben, und Sie können sehen, dass wir immer noch das gleiche Ergebnis erhalten.
Wenn wir uns den Abfrageplan ansehen, sehen Sie, dass er etwas länger ist, aber viel einfacher zu lesen.
Abschließend finden Sie hier auch die berechnete Version des Codes
Und so sieht sein logischer Abfrageplan aus.
DAX LuckyTemplates: Was ist Zeilenkontext?
Einführung in den Filterkontext in LuckyTemplates.
Was ist Kontextübergang und warum ist er wichtig?
Abschluss
In diesem Tutorial habe ich erklärt, wie eine bestimmte Funktion mit dem Zeilenkontext interagieren kann und nicht. Ich habe Ihnen auch gezeigt, wie der MAX in diesem Fall im Filterkontext und nicht im Zeilenkontext ausgewertet wurde.
Es ist wichtig, immer daran zu denken, dass der Filterkontext das gesamte Modell filtert und der Zeilenkontext nur die angegebene Tabelle iteriert und niemals das Modell filtert. Der Filterkontext iteriert keine Tabelle.
Ich hoffe, Sie fanden dieses Tutorial hilfreich. Seien Sie gespannt auf unseren DAX Studio- Code, den wir in Kürze veröffentlichen werden. Wir werden viel tiefer auf ähnliche Szenarien eingehen. Außerdem zeigen wir Ihnen, wie Sie Ihren DAX-Code optimieren können.
Sie erfahren, wie Sie Objekte aus einer .rds-Datei in R speichern und laden. In diesem Blog wird auch behandelt, wie Sie Objekte aus R in LuckyTemplates importieren.
Was ist Self in Python: Beispiele aus der Praxis
In diesem Tutorial zur DAX-Codierungssprache erfahren Sie, wie Sie die GENERATE-Funktion verwenden und einen Kennzahltitel dynamisch ändern.
In diesem Tutorial erfahren Sie, wie Sie mithilfe der Multi-Threaded-Dynamic-Visuals-Technik Erkenntnisse aus dynamischen Datenvisualisierungen in Ihren Berichten gewinnen.
In diesem Artikel werde ich den Filterkontext durchgehen. Der Filterkontext ist eines der Hauptthemen, über die sich jeder LuckyTemplates-Benutzer zunächst informieren sollte.
Ich möchte zeigen, wie der LuckyTemplates Apps-Onlinedienst bei der Verwaltung verschiedener Berichte und Erkenntnisse aus verschiedenen Quellen helfen kann.
Erfahren Sie, wie Sie Ihre Gewinnmargenänderungen mithilfe von Techniken wie Kennzahlenverzweigung und der Kombination von DAX-Formeln in LuckyTemplates ermitteln.
In diesem Tutorial werden die Ideen der Materialisierung von Datencaches und deren Auswirkungen auf die Leistung von DAXs bei der Bereitstellung von Ergebnissen erläutert.
Wenn Sie bisher noch Excel verwenden, ist dies der beste Zeitpunkt, LuckyTemplates für Ihre Geschäftsberichtsanforderungen zu verwenden.
Was ist LuckyTemplates Gateway? Alles was du wissen musst