Monday 30 October 2017

Moving Average Mdx


SQL Server 2008 SQL Server Denali PowerPivot Ja, I8217m ein Unterstützer der Gleichberechtigung von DAX und MDX. Und wie viele andere, ich kann nicht warten, um BISM multidimensionale (alias OLAP Cubes) Unterstützung DAX, so dass wir Projekt Crescent auf all die schönen Würfel verwenden können. Aber zurück zu meinem Thema. Mein letzter Post war über gleitende Durchschnitte im DAX und ich war so sicher, dass ich über das Berechnen sie in MDX before8230 blogging, aber ich didn8217t. Das ist nicht fair. Auf der anderen Seite, Mosha Pasumansky, der Pate von MDX, schrieb einen ausgezeichneten und sehr vollständigen Artikel zu diesem Thema und ich kann nur vorschlagen, es zu lesen. Es deckt nur einfache gleitende Durchschnitte, aber auch gewichtete und exponentielle ab. Auch Bill Pearson schrieb eine sehr gute Schritt-für-Schritt-Anleitung zu diesem Thema. Sie finden es hier und ich kann nur vorschlagen, es zu lesen. Also, im Grunde gibt es keine Notwendigkeit für mich, einen anderen Artikel darüber schreiben. Daher wird dies ein sehr kurzes Blog post8230 ah, ich erinnere mich nur etwas, über das ich schreiben kann. Mosha und Bill untersuchten die Berechnung der gleitenden Mittelwerte innerhalb einer Abfrage. Im Kontext einer bestimmten Abfrage sind die Dinge manchmal einfacher, verglichen mit der Situation, in der Sie ein Cube-Maß erstellen, das unter verschiedenen Abfragebedingungen arbeiten muss. Sie können zum Beispiel nicht wissen, welche Hierarchie verwendet wurde. Das erste, was in den Sinn kommt, ist der Assistent für das Hinzufügen von Zeit Intelligenz. Dieser Assistent macht einen ziemlich guten Job. Das Hauptergebnis ist ein kurzes Stück Code, der in das Cube-Skript eingefügt wird. Dieses Stück Code ähnelt dem folgenden Beispiel: Drei Monate gleitender Average160 160 (160.160.160 Date. Calendar Datum Calculations. Three Monat Moving Average, 160.160.160 Date. Month Name. Month Name. Members, 160.160.160 Date. Date. Members 160) 160 160160160 160 Avg (160160160160160160 Parallelperiod (160160160160160160160160160160160160160160160160160160160160160160 Date. Calendar. Month, 160160160160160160160160160160160160160160160160160160160160160160 2, 160160160160160160160160160160160160160160160160160160160160160160 Date. Calendar. CurrentMember 160160160160160160) 160160160160160160. Date. Calendar. CurrentMember 160160160160160160 160160160160160160 Date. Calendar Datum Calculations. Current Datum 160) 160 Ende Scope kann die Folge sein Intuitiv von Endbenutzern verwendet werden, da sie einfach auswählen müssen, in welcher Art von Ansicht die Daten erscheinen sollen (tatsächlicher, dreimonatiger gleitender Durchschnitt oder irgendeine andere Berechnung, die vom Assistenten generiert wird, z. B. Jahr zu Tag oder Jahreszuwachs ). Auch diese Berechnung konzentriert sich auf die Daten-Dimension, nicht die spezifische Maßnahme, so dass es für jede Maßnahme im Cube verwendet werden kann. In meinem letzten Beitrag habe ich eine DAX-Berechnung, die den gleitenden Durchschnitt auf der Grundlage der letzten Datum in der aktuellen Intervall berechnet. Wir können ziemlich viel das gleiche in MDX durch 8220translating8221 die DAX Formel zu MDX. Hier ist die Berechnung für einen Würfel berechnete Element: CREATE MEMBER CURRENTCUBE. Measures. SalesAmountAvg30d AS160 Avg (160 LASTPERIODS (160 160160160160160160 30 160160160160160160. Schwanz (Nachkommen (Date. Calendar. currentmember, Date. Calendar. Date), 1).item ( 0) 160) 160. Measures. Internet Sales Amount) Nach der Definition dieser Maßnahme können wir sie in einer Abfrage oder innerhalb einer Pivot-Tabelle verwenden. Here8217s das Ergebnis aus einer Abfrage: Wenn Sie diese Werte mit den Werten aus meinem letzten Post vergleichen sehen Sie, dass die Werte absolut identisch sind (nur die Reihenfolge der Werte unterscheidet sich wegen der Art, wie ich die Abfrage schrieb). Hier sind beide Definitionen nebeneinander: mit Mitglied SalesAmountAvg AS160 160 Avg (160.160.160 LASTPERIODS (160 160160160160160 30 160160160160160. Schwanz (160160160160160160160 Nachkommen (160160160160160160160160160 Date. Calendar. currentmember 160160160160160160160160160, Date. Calendar. Date), 1 160160160160160160160).item (0 ) 160160160) 160160160. Measures. Internet Verkaufsbetrag 160) 160 wählen 160 Measures. Internet Verkaufsbetrag 160 SalesAmountAvg auf 0, Nachkommen (Date. Calendar. All Perioden ,, Blätter) auf 1 von Adventure Works definieren Internet SalesSalesAmountAvg 160 AverageX messen ( 160160160 Summarize (160160160160160 datesinperiod (DateDate160 160160160160160. lastdate (DateDate), -30, TAG) 160 160160160160160, DateDate160 160160160160160. quotSalesAmountSumquot 160160160160160. berechnen (160 160160160160160160160160160 Sum (160160160160160160160160160 Internet SalesSales Betrag) 160160160160160160160160160, ALLEXCEPT (160160160160160160160160160 Datum, DateDate) 160160160160160160160) 160160160, SalesAmountSum) 160160160, SalesAmountSum) 160160160, 160160160 Internet SalesSalesAmountAvg 160)) Beide Abfragen geben genau das zurück Gleiche Ergebnisse (Sie können eine 8220order durch 8216Date8217Date8221 am Ende der DAX-Abfrage hinzufügen, um die Daten in der gleichen Reihenfolge wie aus der MDX-Abfrage zurückgegeben haben). Für die MDX-Abfragen Ich löschte den Cache vor dem Ausführen der Abfragen. Ich änderte die Anzahl der Tage (Anzahl der Tage, um in den Durchschnitt, fett geschrieben, rot in die Abfragen oben) und bekam die folgenden Ergebnisse. Für die Anzahl der Tage 0 nahm ich die Berechnung und ließ nur die Verkaufsmenge als Aggregat. Die Zeit wurde in Sekunden mit SQL Server Management Studio (auf einer virtuellen Maschine, alte Hardware) gemessen. Bei der Betrachtung dieser Ergebnisse war ich etwas überrascht. Nicht über die Situation, die die DAX-Abfrage länger dauert, um auszuführen. Bitte beachten Sie, dass I8217m laufen die Abfragen auf eine frühe Vorschau des Produkts so nehme ich an, es gibt immer noch eine Menge von Debugging und interne Protokollierung geht hier. Wir müssen auf das Endprodukt warten, um einen Vergleich herzustellen. Was mich überrascht, war die Tatsache, dass die DAX-Abfragezeit nicht signifikant mit höheren Werten von n steigt. Für den MDX-Motor war ich ziemlich sicher, dass es auf diese Weise durchführen würde, weil wir reifen und einen gut gebauten Cache dahinter haben. Also, obwohl wir die Anzahl der berechneten Zellen dramatisch erhöhen (mit höheren Werten für n), sollte die MDX-Abfrage Leistung fast konstant sein, wie wir haben eine Menge von überlappenden Berechnungen hier. Aber auch der aktuelle DAX-Motor funktioniert genauso wie der DAX-Motor. Dies ist ein ziemlich gutes Ergebnis und wir können viel Leistung von diesem neuen DAX-Abfrage-Engine erwarten. Keine Kommentare: Kommentar veröffentlichen Blog Archive Hilmar Buchta Mein vollständiges Profil ansehenSQL Server Denali PowerPivot Alberto Ferrari schrieb bereits über die Berechnung der gleitenden Durchschnittswerte im DAX mit Hilfe einer berechneten Spalte. Ich möchte hier einen anderen Ansatz vorstellen. Für den gleitenden Durchschnitt Im berechnen einen täglich gleitenden Durchschnitt (in den letzten 30 Tagen) hier. Für mein Beispiel Im Im Verwenden der PowerPivot-Arbeitsmappe, die als Teil der SSAS-Tabellarischen Modellprojekte aus den Denali CTP 3-Beispiel heruntergeladen werden kann. In diesem Beitrag, Im die Entwicklung der Formel Schritt für Schritt. Allerdings, wenn Sie in Eile sind, könnten Sie direkt auf die endgültigen Ergebnisse unten zu springen. Bei den Details sehen die Beispieldaten wie folgt aus: In jedem Zeilenkontext gibt der Ausdruck 8216DateDate den aktuellen Kontext an, dh das Datum für diese Zeile . Aber aus einer berechneten Maßnahme können wir nicht auf diesen Ausdruck verweisen (da es keine aktuelle Zeile für die Date-Tabelle gibt), stattdessen müssen wir einen Ausdruck wie LastDate (8216DateDate) verwenden. Also, um die letzten 30 Tage bekommen wir diesen Ausdruck verwenden, können wir unseren Vertrieb über das Internet für jeden dieser Tage mit dem summarise Funktion zusammenfassen kann: Fasse (DatesInPeriod (8216DateDate, lastdate (8216DateDate), - 30, TAG), .. 8217DateDate 8220SalesAmountSum8221 Sum (8216Internet SalesSales Amount)) Und schließlich wurden mit der Funktion DAX AverageX der Durchschnitt dieser 30 Werte zu berechnen: Verkaufsbetrag (30d avg): AverageX (Summarize (DatesInPeriod (8216DateDate, lastdate (8216DateDate), - 30, TAG), 8217DateDate 8220SalesAmountSum8221 Sum (8216Internet SalesSales Amount)), SalesAmountSum) Dies ist die Berechnung, die in unserem Internet-Sales-Tabelle verwenden, wie unten im Screenshot zu sehen:.. Wenn das Hinzufügen dieser Berechnung zu der Pivot-Tabelle von oben, Das Ergebnis sieht folgendermaßen aus: Betrachtet man das Ergebnis, scheint es, dass wir keine Daten vor dem 1. Januar 2003 haben: Der erste Wert für den gleitenden Durchschnitt ist identisch mit dem Tageswert (es gibt keine Zeilen vor diesem Datum). Der zweite Wert für den gleitenden Durchschnitt ist tatsächlich der Durchschnitt der ersten beiden Tage und so weiter. Dies ist nicht ganz richtig, aber Im immer wieder auf dieses Problem in einer Sekunde. Der Screenshot zeigt die Berechnung für den gleitenden Durchschnitt vom 31. Januar als Durchschnitt der täglichen Werte vom 2. bis 31. Januar. Unsere errechnete Maßnahme funktioniert auch, wenn Filter angewendet werden. Im folgenden Screenshot habe ich zwei Produktkategorien für die Datenreihe verwendet: Wie funktioniert unsere berechnete Messung auf höheren Aggregationsebenen? Um herauszufinden, wie ich die Kalenderhierarchie in den Zeilen (anstelle des Datums) verwende. Zur Vereinfachung entfernte ich die Semester - und Viertelstufen mit Excels-Pivot-Tabellenoptionen (Option ShowHide fields). Wie Sie sehen können, funktioniert die Berechnung immer noch gut. Hier ist das monatliche Aggregat der gleitende Durchschnitt für den letzten Tag des jeweiligen Monats. Sie sehen das deutlich für Januar (Wert von 14.215.01 erscheint auch im Screenshot oben als Wert für den 31. Januar). Wenn dies die Geschäftsanforderung (die vernünftig für einen täglichen Durchschnitt klingt), dann die Aggregation funktioniert auf monatlicher Ebene (sonst müssen wir Feinabstimmung unserer Berechnung und das wird ein Thema der kommenden Post sein). Aber obwohl die Aggregation auf einer monatlichen Ebene sinnvoll ist, wenn wir diese Ansicht auf den Tagespegel erweitern, sehen wir, dass unsere berechnete Maßnahme einfach die Umsatzmenge für diesen Tag zurückgibt, nicht den Durchschnitt der letzten 30 Tage mehr: Wie kann das sein. Das Problem ergibt sich aus dem Kontext, in dem wir unsere Summe zu berechnen, wie im folgenden Code hervorgehoben: Verkaufsbetrag (30d avg): AverageX (Summarize (datesinperiod (8216DateDate, lastdate (8216DateDate), - 30, TAG), 8217DateDate 8220SalesAmountSum8221.. Summe (8216Internet SalesSales Amount)), SalesAmountSum) Da wir diesen Ausdruck über den angegebenen Zeitraum auswerten, ist der einzige Kontext, der hier überschrieben wird, 8216DateDate. In unserer Hierarchie wurden verschiedene Attribute aus unserer Dimension (Kalenderjahr, Monat und Tag des Monats) verwendet. Da dieser Kontext noch vorhanden ist, wird die Berechnung auch durch diese Attribute gefiltert. Und das erklärt, warum wir den aktuellen Tag Kontext ist immer noch für jede Zeile. Um die Dinge klar zu machen, solange wir diesen Ausdruck außerhalb eines Datumskontexts auswerten, ist alles in Ordnung, wie die folgende DAX-Abfrage bei der Ausführung von Management Studio im Internet Vertriebsperspektive unseres Modells (unter Verwendung der tabellarischen Datenbank mit denselben Daten) zeigt ): evaluate (Summarize (datesinperiod (8216DateDate, Datum (2003,1,1), - 5, TAG), 8217DateDate 8220SalesAmountSum8221 Sum (8216Internet SalesSales Betrag)..)) Hier habe ich die Zeitdauer bis 5 Tage verkürzt und auch eingestellt Ein festes Datum als LastDate () würde das letzte Datum meiner Datendimensionstabelle ergeben, für die in den Beispieldaten keine Daten vorhanden sind. Hier ist das Ergebnis aus der Abfrage: Nach dem Setzen eines Filters auf 2003 werden jedoch keine Datenzeilen außerhalb von 2003 in die Summe aufgenommen. Das erklärt die oben stehende Bemerkung: Es sah so aus, als hätten wir erst ab dem 1. Januar 2003 Daten. Und jetzt wissen wir, warum: Das Jahr 2003 war auf dem Filter (wie man im ersten Screenshot dieses Beitrags sehen kann) und Daher war es bei der Berechnung der Summe vorhanden. Jetzt müssen wir nur noch diese zusätzlichen Filter loswerden, weil unsere Ergebnisse bereits nach Datum gefiltert wurden. Der einfachste Weg, dies zu tun, besteht darin, die Berechnungsfunktion zu verwenden und ALL () für alle Attribute anzuwenden, für die wir den Filter entfernen möchten. Da wir einige dieser Attribute (Jahr, Monat, Tag, Wochentag) haben und wir den Filter von allen entfernen wollen, aber das Datumsattribut, ist die Verknüpfungsfunktion ALLEXCEPT hier sehr nützlich. Wenn Sie einen MDX-Hintergrund haben, werden Sie sich fragen, warum wir nicht ein ähnliches Problem bei der Verwendung von SSAS im OLAP-Modus (BISM Multidimensional). Der Grund ist, dass unsere OLAP-Datenbank Attributbeziehungen hat, also nach dem Setzen des Datums (Schlüssel) Attribut, die anderen Attribute werden automatisch auch geändert und wir müssen nicht darauf achten (siehe meine Post hier). Aber im tabellarischen Modell haben wir keine Attributbeziehungen (nicht einmal ein echtes Schlüsselattribut) und deshalb müssen wir unerwünschte Filter aus unseren Berechnungen eliminieren. Hier sind wir also mit dem Betrag Sales (30d avg): AverageX (Summarize (datesinperiod (8216DateDate, lastdate (8216DateDate), - 30, TAG), 8217DateDate 8220SalesAmountSum8221 berechnen (Sum (8216Internet SalesSales Amount), ALLEXCEPT (8216Date8217,8217DateDate.. ))), SalesAmountSum) Und das ist Tabelle unsere letzte Pivot in Excel: den gleitenden Durchschnitt zu verdeutlichen, hier ist der gleiche Extrakt von Daten in einem Diagrammansicht (Excel): Obwohl wir den gleitenden Durchschnitt auf 2003 zum ersten unsere Daten gefiltert 29 Tage des Jahres 2003 nimmt richtig die entsprechenden Tagen des Jahres 2002 berücksichtigt. Sie werden die Werte für Januar 30 und 31 von unserem ersten Ansatz zu erkennen, da diese waren die ersten Tage, für die unsere erste Berechnung hatte eine ausreichende Menge an Daten (volle 30 Tage).SQL Server 2008 SQL Server 2008R2 SQL Server Denali PowerPivot Ja, Im Ein Unterstützer der Gleichberechtigung von DAX und MDX. Und wie viele andere, kann ich nicht warten, um BISM multidimensionale (alias OLAP Cubes) Unterstützung DAX haben, so dass wir Projekt Crescent auf alle diese schönen Würfel verwenden können. Aber zurück zu meinem Thema. Mein letzter Post war über gleitende Durchschnitte im DAX und ich war so sicher, dass ich über das Berechnen sie in MDX vorher dachte, aber ich didnt. Das ist nicht fair. Auf der anderen Seite, Mosha Pasumansky, der Pate von MDX, schrieb einen ausgezeichneten und sehr vollständigen Artikel zu diesem Thema und ich kann nur vorschlagen, es zu lesen. Es umfasst nicht nur einfache gleitende Durchschnitte, sondern auch gewichtete und exponentielle. Auch Bill Pearson schrieb eine sehr gute Schritt-für-Schritt-Anleitung zu diesem Thema. Sie finden es hier und ich kann nur vorschlagen, es zu lesen. Also, im Grunde gibt es keine Notwendigkeit für mich, einen anderen Artikel darüber schreiben. Deshalb wird dies eine sehr kurze Blog-Post ah, ich erinnere mich etwas, was ich schreiben kann. Mosha und Bill untersuchten die Berechnung der gleitenden Mittelwerte innerhalb einer Abfrage. Im Kontext einer bestimmten Abfrage sind die Dinge manchmal einfacher, verglichen mit der Situation, in der Sie ein Cube-Maß erstellen, das unter verschiedenen Abfragebedingungen arbeiten muss. Sie können zum Beispiel nicht wissen, welche Hierarchie verwendet wurde. Das erste, was in den Sinn kommt, ist der Assistent für das Hinzufügen von Zeit Intelligenz. Dieser Assistent macht einen ziemlich guten Job. Das Hauptergebnis ist ein kurzes Stück Code, der in das Cube-Skript eingefügt wird. Dieses Stück Code ähnelt dem folgenden Beispiel: Drei Monate gleitender Durchschnitt (Date. Calendar Datum Calculations. Three Monat Moving Average, Date. Month Name. Month Name. Members, Date. Date. Members) Avg (Parallelperiod (Date. Calendar Date. Calendar. CurrentMember Date. Calendar Date Calculations. Current Date) End Scope Das Ergebnis kann intuitiv von Endbenutzern verwendet werden, da sie einfach auswählen müssen, in welcher Art von Ansicht die Daten (Tatsächlicher, dreimonatiger gleitender Durchschnitt oder jede andere vom Assistenten generierte Berechnung, z. B. Jahr zu Tag oder Jahreswachstum). Auch diese Berechnung konzentriert sich auf die Daten-Dimension, nicht die spezifische Maßnahme, so dass es für jede Maßnahme im Cube verwendet werden kann. In meinem letzten Beitrag habe ich eine DAX-Berechnung, die den gleitenden Durchschnitt auf der Grundlage der letzten Datum in der aktuellen Intervall berechnet. Wir können ziemlich viel das gleiche in MDX durch die Übersetzung der DAX Formel auf MDX. Hier ist die Berechnung für einen Würfel berechnet Mitglied:. CREATE MEMBER CURRENTCUBE. Measures. SalesAmountAvg30d AS Avg (LASTPERIODS (30 Schwanz (Nachkommen (Date. Calendar. currentmember, Date. Calendar. Date), 1).item (0)). Measures. Internet Sales Amount) Nach der Definition dieser Maßnahme können wir sie in einer Abfrage oder in einer Pivot-Tabelle verwenden. Heres das Ergebnis aus einer Abfrage: Wenn Sie diese Werte mit den Werten aus meinem letzten Post vergleichen sehen Sie, dass die Werte absolut identisch sind (nur die Reihenfolge der Werte unterscheidet sich wegen der Art, wie ich die Abfrage schrieb). Hier sind beide Definitionen nebeneinander: mit Mitglieds SalesAmountAvg AS Avg (.. LASTPERIODS (30 Schwanz (Nachkommen (Date. Calendar. currentmember, Date. Calendar. Date), 1).item (0)) Measures. Internet Verkaufsbetrag) Wählen Sie Measures. Internet Sales Amount. SalesAmountAvg auf 0, Nachkommen (Date. Calendar. All Perioden ,, Blätter) auf 1 von Adventure Works definieren 8216Internet SalesSalesAmountAvg AverageX messen (Fasse (datesinperiod (8216DateDate. Lastdate (8216DateDate), -30, TAG), 8217DateDate. 8220SalesAmountSum8221. Berechnen ( Sum (8216Internet SalesSales Amount), ALLEXCEPT (8216Date8217,8217DateDate))), SalesAmountSum) auswerten (addcolumns (Werte (8216DateDate), 8221Internet Umsatz Amount8221. SUMX (RELATED (8216Internet Sales8217), Sales Amount), 8221SalesAmountAvg8221, 8216Internet SalesSalesAmountAvg)) Beide Abfragen geben genau die gleichen Ergebnisse (Sie eine Bestellung von DateDate am Ende der DAX-Abfrage, um die Daten in der gleichen Reihenfolge wie aus der MDX-Abfrage zurückgegeben zu haben, kann hinzufügen). Für die MDX-Abfragen Ich löschte den Cache vor dem Ausführen der Abfragen. Ich habe die Anzahl der Tage (Anzahl der Tage im Durchschnitt enthalten, geschrieben fett, rot in den Abfragen oben) und bekam die folgenden Ergebnisse. Für die Anzahl der Tage 0 nahm ich die Berechnung und verließ nur die Verkaufsmenge als Aggregat. Die Zeit wurde in Sekunden mit SQL Server Management Studio (auf einer virtuellen Maschine, alte Hardware) gemessen. Bei der Betrachtung dieser Ergebnisse war ich etwas überrascht. Nicht über die Situation, die die DAX-Abfrage länger dauert, um auszuführen. Bitte beachten Sie, dass Im die Abfragen auf einer frühen Vorschau des Produkts ausgeführt, damit ich es annehmen, ist immer noch eine Menge Debugging und die interne Protokollierung hier los ist. Wir müssen auf das Endprodukt warten, um einen Vergleich herzustellen. Was mich überrascht, war die Tatsache, dass die DAX-Abfragezeit nicht signifikant mit höheren Werten von n steigt. Für den MDX-Motor war ich ziemlich sicher, dass es auf diese Weise durchführen würde, weil wir reifen und einen gut gebauten Cache dahinter haben. Also, auch wenn waren dramatisch die Zahl der berechneten Zellen zu erhöhen (mit höheren Werten für n) sollte die MDX-Abfrage-Leistung nahezu konstant sein, wie wir eine Menge von überlappenden Berechnungen hier haben. Aber auch der aktuelle DAX-Motor funktioniert genauso wie der DAX-Motor. Dies ist ein ziemlich gutes Ergebnis und wir können viel Leistung von diesem neuen DAX-Abfrage-Engine erwarten. Wie diese: Post navigation Lassen Sie eine Antwort Antworten abbrechen d bloggers like this:

No comments:

Post a Comment