Ich habe eine Tabellenproduktion, die die folgende Struktur enthält: Ich habe Daten für jeden Repräsentanten von 112011 bis 812013. Was ich in der Lage sein werde, zu tun, ist, einen 12-monatigen gleitenden Durchschnitt zu beginnen, der 112012 für jeden Repräsentanten folgt, wie folgt: wo jede Zeile repräsentiert Der 12-Monats-Gleitender Durchschnitt für die Rep. Zum angegebenen Zeitpunkt. Ich fand einige Beispiele, die vage dicht waren und ich versuchte sie ohne Erfolg. Es scheint, dass die Hinzufügung einer Gruppe durch Repräsentationskomponente die Hauptabweichung von anderen Beispielen ist. Dies ist ungefähr so weit wie ich bekam: Diese Abfrage scheint einen Gesamtdurchschnitt oder eine Summe zu ziehen, da es keine Gruppierung in der korrelierten Unterabfrage gibt. Wenn ich versuche zu gruppieren, bekomme ich einen Fehler, dass es nur eine Stunde zurückkehren kann. Gefragt am 10. Oktober 13 um 14: 47Rolling 12 Monate Durchschnitt in DAX Computing der rollende 12-Monats-Durchschnitt in DAX sieht aus wie eine einfache Aufgabe, aber es verbirgt einige Komplexität. Dieser Artikel erklärt, wie man die beste Formel, die gemeinsame Fallstricke mit Zeit Intelligenz Funktionen zu vermeiden. Wir beginnen mit dem üblichen AdventureWorks Datenmodell, mit Produkten, Verkauf und Kalender Tisch. Der Kalender wurde als Kalendertabelle markiert (es ist notwendig, mit jeder Zeit Intelligenz-Funktion zu arbeiten) und wir bauten eine einfache Hierarchie Jahr-Monat-Datum. Mit diesem Setup ist es sehr einfach, eine erste PivotTable zu erstellen, die den Verkauf im Laufe der Zeit zeigt: Wenn Sie Trendanalyse durchführen, wenn der Verkauf der Saisonalität entspricht oder allgemeiner, wenn Sie den Effekt von Peaks und Tropfen im Verkauf entfernen möchten, Gemeinsame Technik ist die Berechnung der Wert über einen bestimmten Zeitraum, in der Regel 12 Monate, und durchschnittlich es. Der rollende Durchschnitt über 12 Monate bietet einen reibungslosen Indikator für den Trend und ist in Charts sehr nützlich. Angesichts eines Datums können wir den 12-monatigen rollenden Durchschnitt mit dieser Formel berechnen, die noch einige Probleme hat, die wir später lösen werden: Das Verhalten der Formel ist einfach: Es berechnet den Wert des Umsatzes nach dem Erstellen eines Filters auf dem Kalender, der Zeigt genau ein ganzes Jahr der Daten. Der Kern der Formel ist die DATESBETWEEN, die einen inklusiven Satz von Daten zwischen den beiden Grenzen zurückgibt. Die untere ist: Lesen Sie es von der innersten: Wenn wir Daten für einen Monat zeigen, sagen wir Juli 2007, nehmen wir das letzte sichtbare Datum mit LASTDATE, die den letzten Tag im Juli 2007 zurückgibt. Dann verwenden wir NEXTDAY, um die 1. zu nehmen Von August 2007 und wir verwenden endlich SAMEPERIODLASTYEAR, um es ein Jahr zurückzusetzen, was den 1. August 2006 ergibt. Die obere Grenze ist einfach LASTDATE, dh Ende Juli 2007. Wenn wir diese Formel in einer PivotTable verwenden, sieht das Ergebnis gut aus, aber wir Haben Sie ein Problem für das letzte Datum: In der Tat, wie Sie in der Abbildung sehen können, wird der Wert korrekt bis 2008 berechnet. Dann gibt es keinen Wert im Jahr 2009 (das ist richtig, wir haben keinen Umsatz im Jahr 2009), aber es gibt Ein überraschender Wert im Dezember 2010, wo unsere Formel die Gesamtsumme anstelle eines Blindwertes zeigt, wie wir erwarten würden. In der Tat, am Dezember, kommt LASTDATE den letzten Tag des Jahres und NEXTDAY sollte den 1. Januar 2011 zurückgeben. Aber NEXTDAY ist eine Zeit Intelligenz-Funktion und es wird erwartet, dass Sätze von bestehenden Daten zurückzugeben. Diese Tatsache ist nicht sehr offensichtlich und es lohnt sich ein paar Worte mehr. Zeit-Intelligenz-Funktionen führen keine Mathematik auf Daten. Wenn du den Tag nach einem bestimmten Datum nehmen möchtest, kannst du einfach 1 zu jeder Datumsspalte hinzufügen und das Ergebnis wird am nächsten Tag sein. Stattdessen verschieben Zeit-Intelligenz-Funktionen Sätze von Datum hin und her über die Zeit. So nimmt NEXTDAY seinen Eingang (in unserem Fall eine einreihige Tabelle mit dem 31. Dezember 2010) und verschiebt ihn einen Tag später. Das Problem ist, dass das Ergebnis der 1. Januar 2011 sein sollte, aber da die Kalender-Tabelle dieses Datum nicht enthält, ist das Ergebnis BLANK. So berechtigt unser Ausdruck den Verkauf mit einer leeren unteren Grenze, was den Beginn der Zeit bedeutet, was die Gesamtsumme des Umsatzes ergibt. Um die Formel zu korrigieren, genügt es, die Auswertungsreihenfolge der unteren Grenze zu ändern: Wie Sie sehen können, wird jetzt NEXTDAY nach der Verschiebung von einem Jahr zurückgerufen. Auf diese Weise nehmen wir den 31. Dezember 2010, verschieben ihn bis zum 31. Dezember 2009 und nehmen den nächsten Tag, der 1. Januar 2010 ist: ein bestehendes Datum in der Kalendertabelle. Das Ergebnis ist jetzt das erwartete: An diesem Punkt müssen wir nur diese Zahl um 12 teilen, um den rollenden Durchschnitt zu erhalten. Aber, wie Sie sich leicht vorstellen können, können wir es nicht immer durch 12 teilen. In der Tat, zu Beginn der Periode gibt es nicht 12 Monate zu aggregieren, aber eine niedrigere Zahl. Wir müssen die Anzahl der Monate berechnen, für die es Verkäufe gibt. Dies kann durch die Querfiltration der Kalendertabelle mit der Verkaufstabelle erreicht werden, nachdem wir den neuen 12 Monate Kontext angewendet haben. Wir definieren eine neue Maßnahme, die die Anzahl der bestehenden Monate in der 12-Monats-Periode berechnet: Sie können in der nächsten Abbildung sehen, dass die Months12M-Maßnahme einen korrekten Wert berechnet: Es ist zu beachten, dass die Formel nicht funktioniert, wenn Sie einen Zeitraum wählen Länger als 12 Monate, da der CalendarMonthName nur 12 Werte hat. Wenn Sie längere Zeiträume benötigen, müssen Sie eine YYYYMM-Spalte verwenden, um mehr als 12 zählen zu können. Der interessante Teil dieser Formel, der Cross-Filter verwendet, ist die Tatsache, dass es die Anzahl der verfügbaren Monate berechnet, auch wenn Sie mit anderen filtern Attribute. Wenn Sie zum Beispiel die blaue Farbe mit einem Slicer auswählen, dann beginnt der Verkauf im Juli 2007 (nicht im Jahr 2005, wie es für viele andere Farben passiert). Mit dem Cross-Filter auf Sales, die Formel richtig berechnet, dass im Juli 2007 gibt es einen einzigen Monat verfügbaren Verkäufe für Blue: An diesem Punkt ist der rollende Durchschnitt nur ein DIVIDE entfernt: Wenn wir es in einer Pivot-Tabelle verwenden, haben wir noch Haben ein kleines Problem: In der Tat wird der Wert auch für Monate berechnet, für die es keine Verkäufe gibt (dh zukünftige Monate): Dies kann mit einer IF-Anweisung gelöst werden, um zu verhindern, dass die Formel Werte zeigt, wenn es keine Verkäufe gibt. Ich habe nichts gegen IF, aber für die Leistung-süchtig unter euch, ist es immer daran zu erinnern, dass IF könnte ein Performance-Killer sein, weil es könnte DAX-Formel-Engine zu treten. In diesem speziellen Fall ist der Unterschied vernachlässigbar, aber , In der Regel die beste Weg, um den Wert zu entfernen, wenn es keine Verkäufe ist, um auf reine Speicher-Engine-Formeln wie diese zu verlassen: Vergleich eines Diagramms mit dem Avg12M mit einem anderen, der Verkäufe zeigt, können Sie leicht zu schätzen, wie der rollende Durchschnitt Umreißt Trends in einer viel saubereren Weise: Halten Sie mich über die kommenden Artikel (Newsletter) informiert. Deaktivieren Sie, um die Datei frei herunterzuladen. Jetzt möchte ich ein Diagramm, das diesen 12Monat-gleitenden Durchschnitt für die letzten 12 Monate zeigt, d. h. auf der horizontalen Achse die letzten 12 Monate und auf der vertikalen Achse den Krankheitsanteil. Ich habe einen Datensatz namens Last12Months erstellt, aber das ist natürlich falsch, z. B. Für den gleitenden durchschnittlichen kranken Prozentsatz von Juli 2010 braucht der gleitende Durchschnitt die Krankheitsprozentsätze von August 2009 bis Juli 2010. HOwever, bei der Verwendung eines Datensatzes, der die letzten 12 Monate enthält, sind die Krankheitsprozentsätze für vor Juli 2010 nicht für die Berechnung des Umzugs verfügbar Durchschnitt von Juli 2010. Könnten Sie bitte geben Sie mehr Erklärung, um diese können Sie einige Bericht Proben Layout, um Ihre Anforderung zu löschen, um Ihren letzten Absatz, es scheint, dass Sie einen Filter zu Kategorie Gruppe in der Tabelle geben, um die neuesten letzten 12 zu zeigen Monat, richtig, wenn das der Fall ist, denke ich, dass Sie Gebrauch machen können Heute Funktion in Reporting Services, um das aktuelle Jahr und Monat zu bekommen, dann verwenden Sie dieses Jahr zu subtrahieren 1, erhalten Sie letzten 12 Monate. Wenn ich dich falsch verstehe, fühlen Sie sich bitte frei, uns zu informieren. Danke, Challen Fu Erinnern Sie bitte, die Antworten als Antworten zu markieren, wenn sie helfen und sie aufheben, wenn sie keine Hilfe zur Verfügung stellen. Als Antwort von HennieErgon markiert Freitag, den 16. August 2011 um 11:14 Uhr Dienstag, 16. August 2011 um 17:17 Uhr IIf (Monat (heute ()) lt 10, (Jahr (Heute ()) - 2) amp quotM0quot amp Monat (Heute ()), (Jahr (Heute ()) - 2) amp quotMquot amp Monat (heute ())) IIf (Monat (heute ()) lt 10, Jahr (Heute ()) amp quotM0quot amp (Monat (heute) ()) - 1), Jahr (Heute ()) amp quotMquot amp (Monat (heute ()) - 1)) Als Antwort von Challen Fu Moderator markiert Samstag, 20. August 2011 12:50 Bearbeitet von HennieErgon Montag, August 22, 2011 6:18 AM korrekte Reihenfolge der Formel Freitag, 19. August 2011 11:12 Nun möchte ich ein Diagramm mit diesem 12month-gleitenden Durchschnitt für die letzten 12 Monate, dh auf der horizontalen Achse der letzten 12 Monate, und auf Die vertikale Achse der Krankheitsanteil. Ich habe einen Datensatz namens Last12Months erstellt, aber das ist natürlich falsch, z. B. Für den gleitenden durchschnittlichen kranken Prozentsatz von Juli 2010 braucht der gleitende Durchschnitt die Krankheitsprozentsätze von August 2009 bis Juli 2010. HOwever, bei der Verwendung eines Datensatzes, der die letzten 12 Monate enthält, sind die Krankheitsprozentsätze für vor Juli 2010 nicht für die Berechnung des Umzugs verfügbar Durchschnitt von Juli 2010. Könnten Sie bitte geben Sie mehr Erklärung, um diese können Sie einige Bericht Proben Layout, um Ihre Anforderung zu löschen, um Ihren letzten Absatz, es scheint, dass Sie einen Filter zu Kategorie Gruppe in der Tabelle geben, um die neuesten letzten 12 zu zeigen Monat, richtig, wenn das der Fall ist, denke ich, dass Sie Gebrauch machen können Heute Funktion in Reporting Services, um das aktuelle Jahr und Monat zu bekommen, dann verwenden Sie dieses Jahr zu subtrahieren 1, erhalten Sie letzten 12 Monate. Wenn ich dich falsch verstehe, fühlen Sie sich bitte frei, uns zu informieren. Danke, Challen Fu Erinnern Sie bitte, die Antworten als Antworten zu markieren, wenn sie helfen und sie aufheben, wenn sie keine Hilfe zur Verfügung stellen. Als Antwort von HennieErgon markiert Freitag, den 19. August 2011 um 11:14 Uhr Dienstag, 16. August 2011 05:17 Danke für die Antwort. Ich müde mit Filter auf Datum Kategorie, aber dann habe ich andere Probleme. Ich habe ein Beispiel beigefügt. Wie Sie sehen können, ist mein Datumsformat wie 2009M09. Aber um für die letzten 12 (oder 24) Monate zu filtern, muss ich Jahr und Monat teilen. HOwever, wie man im Beispiel sehen kann, dann zum Beispiel die 2009M10, 2009M11 und 2009M12 weggelassen werden, weil es denkt, 10, 11 und 12 sind niedriger als 9. Mittwoch, 17. August 2011 09:46 Wie du mir gesagt hast, Ich habe einen Filter auf der YearMonth Kategorie: IIf (Monat (heute ()) lt 10, (Jahr (Heute ()) - 2) amp quotM0quot amp Monat (heute ()), (Jahr (Heute ()) - 2) Amp quotMquot amp Monat (heute ())) IIf (Monat (heute ()) lt 10, Jahr (Heute ()) amp quotM0quot amp (Monat (heute ()) - 1), Jahr (Heute ()) amp quotMquot amp (Monat (heute ()) - 1)) Als Antwort von Challen Fu Moderator markiert Samstag, 20. August 2011 um 12:50 Uhr Bearbeitet von HennieErgon Montag, 22. August 2011 18:18 korrekte Reihenfolge der Formel Freitag, 19. August, 2011 11:12 AMCalculating Werte in einem Rolling Window in Transact SQL Dwain Camps Berechnung von Werten innerhalb eines Rolling Window in SQL Jede Zeit, die Sie brauchen, um Werte über mehrere Zeilen in SQL zu kombinieren, kann das Problem schwierig sein, vor allem, wenn es um Leistung geht. Wir konzentrieren uns auf das rollende Zwölfmonats-Summenproblem, aber unsere Methoden können auf jedes beliebige Zeitfenster (z. B. 3 Monate) oder auf Durchschnittswerte und andere Aggregationen über diese Zeitfenster angewendet werden. Eine rollende Summe für einen Monat ist die Summe für diesen Monat plus die vorherigen Monate innerhalb des Zeitfensters oder NULL, wenn Sie don8217t die Werte für alle vorhergehenden Monate innerhalb des Zeitfensters haben. In früheren Versionen von SQL Server mussten Sie durch ein paar Reifen springen, um eine Methode zu finden, die gut funktioniert, aber SQL 2012 bietet einige neue Features, die es einfacher machen. In beiden Fällen gibt es mehrere gültige Lösungen. Welches ist am schnellsten und effizientesten Wir versuchen diese Frage in diesem Artikel zu beantworten. Wir werden in SQL 2012 arbeiten. Wenn Sie möchten, um zu folgen, können Sie die Sample Queries. sql Ressource you8217ll finden beigefügt. Daten-Setup und Statement des Business-Problems Oftmals finden Sie sich mit vielen Transaktionen innerhalb eines Monats, aber in unserem Fall we8217ll davon ausgehen, Sie8217ve bereits gruppiert Ihre Transaktionen für jeden Monat. Wir ordnen unseren PRIMARY KEY einem DATE-Datentyp zu und beinhalten einige Werte, über die wir die rollenden zwölfmonatigen Summen ansammeln wollen. Dies führt auch zu einem leichten Abfrageplan, so dass wir uns interessieren wollen, um zu sehen, wie sich seine Leistungsergebnisse mit anderen bisher vorgeschlagenen Lösungen vergleichen lassen. So viel für traditionelle Lösungen, und meine Entschuldigungen, wenn ich zufällig zu einem Ihrer Favoriten übersehen, aber fühlen Sie sich frei, es zu kodieren und fügen Sie es auf die Leistung Test Kabelbaum we8217ll präsentieren später zu sehen, wie es fährt. Lösung 5: Verwenden eines schrulligen Updates Wenn Sie noch nie von der schrulligen Aktualisierung (QU) gehört und wie es auf Probleme wie laufende Summen angewendet werden kann, empfehle ich Ihnen dringend, einen gelesenen Artikel von SQL MVP Jeff Moden zu lesen. Berechtigt, die laufenden Gesamt - und Ordinal-Rang-Probleme zu lösen. Bevor wir fortfahren, sollten wir beachten, dass es diejenigen gibt, die darauf bestehen, dass die QU-Methode ein undokumentiertes Verhalten von SQL Server darstellt und daher nicht vertrauenswürdig ist. Wir können sagen, dass die Syntax durch den MS Books On Line-Eintrag für die UPDATE-Anweisung für SQL-Versionen 2005, 2008 und 2012 klar beschrieben wird. Tatsächlich geht es weiter zurück. Ich habe es erfolgreich in SQL Server 2000 verwendet, aber es wurde von Sybase geerbt und war in der ersten SQL Server-Version, die je veröffentlicht wurde. Zu den naysayers I8217ll sagen, dass das 8220undocumented8221 Verhalten ist mindestens konsistent über alle Versionen und es gibt vermutlich wenig Grund zu vermuten, dass es veraltet werden oder ändern in zukünftigen Versionen von MS SQL. Betrachten Sie sich gewarnt Wenn Sie jemals erwägen, eine QU zu verwenden, um jedes Problem zu lösen, müssen Sie sorgfältig beachten Sie die vielen Regeln, die gelten (auch in den referenzierten Artikel von Jeff enthalten). Die wichtigsten, die I8217ve in dieser Abfrage behandelt haben, können zusammengefasst werden als: Die Tabelle muss einen gruppierten Index haben, der die Reihenfolge der Quellzeilen nach der Periode angibt, wie Sie es wandern möchten. Die Tabelle muss eine Spalte haben, in die Sie die aggregierte laufende Summe platzieren können. Wenn Sie das Update durchführen, müssen Sie die Tabelle mit dem TABLOCKX-Abfrage-Hinweis sperren, um sicherzustellen, dass niemand sonst irgendwelche INSERT s, DELETE s oder UPDATE s vor you8217re durch bekommt. Sie müssen verhindern, dass SQL versucht, die Abfrage mit dem Befehl OPTION (MAXDOP 1) zu parametrieren. Da ein rollender zwölfmonatiger Durchschnitt einfach eine laufende Summe in Verkleidung ist, können wir eine Spalte zu unserer Tabelle hinzufügen und eine QU-Abfrage anwenden, um unsere Berechnung zu tun. Ich muss gestehen, dass das ein bisschen chaotisch aussieht, mit all den Variablen, die du brauchst. Im Grunde, was wir tun, ist, die letzten zwölf (nacheilenden) Werte zu verfolgen, um das 12. zu entfernen (wo die Rolling12Months Spalte zugeordnet ist) von was sonst ein QU läuft, wie es in Jeff8217s Artikel beschrieben ist. Wir haben große Hoffnungen auf seine Geschwindigkeit, da es bekannt ist, die schnellste Methode zur Lösung der laufenden Summen Problem zu sein. Wieder einmal sollten Sie sich davon überzeugen, dass die Ergebnisse mit vorherigen Lösungen übereinstimmen, und ja diese Lösung verhält sich immer noch in SQL 2012. Wenn Sie mich bei mir so weit machen, können Sie sich auch fragen, was passiert, wenn ich mehrfache Laufzeit berechnen muss Zwölf monatige Summen über verschiedene Partitionen8221 Dies ist relativ einfach für alle anderen Lösungen präsentiert, aber schlägt ein bisschen eine Herausforderung mit der QU. Die Antwort darauf finden Sie in der angehängten Ressourcendatei: Quirky Update Partitioned. sql. SQL 2012 Lösungen Bisher wird alles, was wir getan haben, in SQL 2008 funktionieren. Das einzige, was wir in SQL 2005 nicht unterstützt haben, ist die Initialisierung der Variablen, die wir im QU-Ansatz dECLARE haben. Jetzt let8217s sehen, welche neuen Features SQL 2012 hat, die auf dieses Problem angewendet werden kann. Lösung 6: Verwendung eines Fensterrahmens Unsere erste SQL 2012 Lösung (6) zeigt, wie man einen Fensterrahmen benutzt, der 11 Zeilen vor der aktuellen Zeile startet, bis die aktuelle Zeile, um unsere gewünschten Ergebnisse zu erzielen. Wieder einmal sind die zurückgegebenen Ergebnisse die gleichen, aber die Abfrage-Plan ist ganz anders als für die vorherige SQL-2012-Lösung aber wir sind nicht besonders optimistisch, dass dieser Ansatz eine vernünftig durchführbare Alternative aufgrund der Anzahl der 8220look-backs8221 benötigt wird, um es funktionieren zu lassen . Performance Vergleich der Methoden Der echte Test, um zu sehen, wie sich mehrere Lösungen ausführen, ist die Überprüfung der tatsächlichen Ausführungszeiten in einem Ruheserver mit einem Testkabelbaum mit vielen Zeilen. Unser Testkabelbaum wird gezeigt, zusammen mit dem, wie Solution 1 und 2 modifiziert wurden (siehe Kommentare im Code): Legen Sie die Ergebnisse in eine temporäre Tabelle ein, um die verstrichene Zeit zu vermeiden, die die Zeilen auf die Ergebnisse von SQL Server Management Studio8217 zurückführt Gitter. Entfernen Sie die DATE-Arithmetik, denn bei der Erzeugung von Multi-Millionen-Zeilen-Testkabeln ist es schwierig, so viele einzigartige Monate zu erzeugen, so dass die Datentabelle-Spalte überarbeitet wurde, um ein BIGINT-Datentyp zu sein. Für die verbleibenden Lösungen (2 8211 6) haben wir die CPU und die verstrichene Zeit von 1M aber 4M Zeilen gezeichnet. Interpretation der Ergebnisse verstrichen und CPU-Zeiten scheinen über die verschiedenen Methoden in Bezug auf ihre Bestellung konsistent zu sein. Alle scheinen linear zu skalieren. Das schrullige Update, vorausgesetzt, Sie können es verstehen und alle seine zugehörigen Regeln, scheint die schnellste verfügbare Lösung zur Lösung dieses Problems zu sein, auch unter Berücksichtigung der neuen Funktionen, die in SQL 2012 verfügbar sind. In SQL 2012 ist der Fensterrahmen Ansatz sicherlich ordentlich, Kompakt und elegant, aber leicht hinterlässt die quirky Update Lösung über die Reihen, die wir getestet haben. Diese Testergebnisse scheinen mit einem früheren Test auf Laufen Totals in SQL 8220Denali8221 CTP3 von Microsoft Certified Master Wayne Sheffield in seinem Blog entsprechen. Wenn du mit einer früheren Version von SQL (2005 oder 2008) steckst, und aus irgendeinem Grund kannst du ein schrulliges Update verwenden (zB wenn du dieses undokumentierte Verhalten nicht vertraust), sind die schnellsten Lösungen, die dir zur Verfügung stehen, entweder das CROSS APPLY TOP oder Mit einer korrelierten Sub-Abfrage, da beide von ihnen in einer engen Bindung über die Tafel zu sein schienen. Es scheint, dass das 8220traditionelle8221 INNER JOIN etwas zu vermeiden ist. Es wird wohl nur noch schlimmer werden, wenn du in der JOIN8217s ON-Klausel Datum Arithmetik machen musst. Ebenso war mit einem Tally Table oder mehreren LAGs (SQL 2012) sicherlich nicht der Weg zu gehen. Wir haben CURSOR-basierte Lösungen nicht erforscht, aber Sie können den Artikel, der auf laufende Summen referenziert wird, zurückverfolgen, um eine Vorstellung davon zu bekommen, wie sie in diesem Fall auftreten könnten. I8217ve auch einige Lösungen gesehen, die eine rekursive Common Table Expression (rCTE) verwenden, aber ich würde sicherlich auf ihre Leistung im Vergleich zu den QU - oder Fensterrahmenlösungen wetten. Es gibt viele Möglichkeiten, um Werte in einem Rolling-Fenster in SQL zu berechnen und es gibt einige klare Performance-Gewinner unter ihnen. Wir hoffen, dass Sie diesen Leitfaden zu den verfügbaren Methoden interessant und informativ gefunden haben. Abonnieren Sie weitere Artikel Fortnightly Newsletter helfen, schärfen Sie Ihre Fähigkeiten und halten Sie voran, mit Artikeln, ebooks und Meinung, um Sie informiert zu halten. Wünschen Sie mehr Abonnieren Sie unseren vierzehntägigen Newsletter Gesamt: 33 Durchschnitt: 4.65 Dwain Camps ist seit vielen Jahren ein Projektleiter. Weil die Leistung von Anwendungen ein kritischer Erfolgsfaktor für Projekte sein kann, hat er auf die Notwendigkeit, hochleistungsfähige SQL zu entwickeln, evangelisiert. Durch Mentoring und Authoring Artikel auf SQL, hofft er, eine zukünftige Generation von Software-Ingenieure auf der rechten und falschen Möglichkeiten, um SQL-Code zu liefern zu trainieren. Er hat auch ein besonderes Interesse daran, Lösungen für komplexe, datenintensive Probleme mit Hochleistungs-SQL zu entwickeln, da die deklarative Natur von SQL die Entwicklung von algorithmisch einzigartigen Lösungen erlaubt, die prozedurale Sprachen nicht in der Lage sind. Folge Dwain auf Twitter Sehr gut Großer Artikel Ich war überrascht, dass LAG () so schlecht gemacht hat. Ich nehme an, jeder Aufruf wird separat durchgeführt, anstatt ausgefallen und wie ein Fenster optimiert. Große Erklärung Ich bin einverstanden, dies ist eine große Erklärung der verschiedenen Möglichkeiten, um Werte innerhalb eines rollenden Fensters zu berechnen. Wenn Sie diese Beispiele auf SQL 2012 testen, müssen Sie MyTable mit RollingTotalsExample ändern. Vielen Dank, Mr. Camps Tally-Methode Hallo Dwain, ich habe festgestellt, dass Ihre Tally-Tabellen-Abfrage einen Table-Spool-Operator verursacht und dachte, Sie könnten erwägen, den Tally-Teil einer Datentabelle wie folgt zu machen: SELECT GroupingDate, ValueMAX (CASE GroupingDate WHEN Date DANN aValue END), Rolling12MonthsCASE WHEN ROWNUMBER () OVER (ORDER BY GroupingDate) lt 12 DANN NULL ELSE SUM (Wert) END INTO ResultsSoln2 FROM RollingTotalsErstellen Sie eine CROSS APPLY (mdash Entfernen Sie die DATE arithmetischen Werte (Datum), (Date1), (Datum4), (Datum4), (Datum 4), (Datum 6), (Datum 7), (Datum 8), (Datum9), (Datum 10), (Datum11)) c (GroupingDate) GROUP BY GroupingDate HAVING GroupingDate lt MAX (Datum) ORDER BY GroupingDate (Entschuldigung, wenn Formatierung ist schlecht ndash keine Vorschau) Diese Änderung würde immer noch nicht machen, dass es ein Kandidat, aber macht eine massive Verbesserung, dass queryhellip Danke für die Kommentare Danke Joe und Nic. Irsquom froh, dass du den Artikel interessant gefunden hast. Joe: Auch ich war von den LAG-Ergebnissen etwas überrascht und es macht mich fragen, was der Break-even-Punkt wäre. Vielleicht vielleicht 3 Monate nicht so schlimm, aber es ist immer noch schwer zu glauben, dass es schneller sein könnte als die QU. Tally Tables MM: Aus irgendeinem Grund habe ich eine persönliche Vorliebe für Inline-Tally-Tische, aber deine Ergebnisse sind interessant, wenn man nur für andere Fälle in Betracht zieht. Assistance mit Moving Annual Total Meine erste Post. Ich muss die Moving Annual Total für den oben genannten Wert für die vorangegangenen 12 Monate berechnen, mit diesem Monat Monat 12. Ich muss dann die Moving Annual Total für die 12 Monate davor erhalten. Mit der Idee, MAT für diesen Monat mit dem entsprechenden Monat im vergangenen Jahr und für jeden vorangegangenen Monat zu vergleichen. Mein Versuch gab mir das: Mit cte as (SELECT rNum ROWNUMBER () Over (Reihenfolge nach Datum) Datum Wert Rolling12MonthsCASE WHEN ROWNUMBER () OVER (ORDER BY Datum) gt 11 DANN SUM (Wert) OVER (ORDER BY Datum ROWS ZWISCHEN 11 Wählen Sie aus cte, (Wählen Sie mRNum max (rNum) von cte) deMax Wo rNum zwischen mRNum ndash 23 und mRNum Mit der Fähigkeit, die Were-Anweisung zu ändern, um zu reflektieren, ob ich dieses Jahr oder das wollen. Deutsch: www. tab. fzk. de/de/projekt/zusammenf...ng/ab117.htm vorheriges Jahr. Meine wirklichen Daten haben das Datum wie in Integer 201409, was ich denke, das Leben wird mir leichter machen, da ich 100 abziehen kann, um das Vorjahr zu bekommen. Ausgezeichneter Artikel und jede Hilfe wäre willkommen. Dies ist meine Arbeitslösung (mit etwas Lärm) mdash Rolling 12 Monate Summen mit SQL 2012 und einem Fensterrahmen IF OBJECTID (lsquotempdb..PreviousYearrsquo) IST NICHT NULL DROP TABLE PreviousYear Mit cte as (SELECT rNum ROWNUMBER () Over (order by Date (Datum) ROWS ZWISCHEN 11 VORHERGEHENDEN UND AKTUELLEN REIHEN END VON RollingTotalsExample) Wählen Sie pyRowNum ROWNUMBER () Over (order by mRNum.). WERDEN ROWNUMBER () OVER (ORDER DURCH Datum) ). . SStart mRNum ndash 24. EEnd mRNum ndash 12 in Vorheriges Jahr Von cte, (Wählen Sie mRNum max (rNum) von cte) deMax Wo rNum zwischen mRNum ndash 23 und mRNum ndash 12 mdash Rolling 12 Monate Summen mit SQL 2012 und einem Fensterrahmen IF OBJECTID (lsquotempdb..ThisYearrsquo) IST NICHT NULL TROPFEN TABELLE DiesesJahr mit cte as (SELECT rNum ROWNUMBER () Over (Reihenfolge nach Datum) Datum Wert Rolling12MonthsCASE WHEN ROWNUMBER () OVER (ORDER BY Datum) gt 11 DANN SUM (Wert) OVER (ORDER BY Datum ROWS ZWISCHEN 11 VORHERIGEN UND AKTUELLEN REIHEN) END VON RollingTotalsExample) Wählen Sie tyRowNum ROWNUMBER () Over (order by mRNum). . SStart mRNum ndash 11. EEnd mRNum in ThisYear Von cte, (Select mRNum max (rNum) von cte) deMax Wo rNum zwischen mRNum ndash 11 und mRNum Select from ThisYear ty Left Join Vorheriges Jahr py on ty. tyRowNum py. pyRowNum Diese können Irsquom nicht in der Nähe eines comp mit Sql Zugang jetzt, so dass ich canrsquot testen Sie es (es kann einige typossyntax Fehler). SELECT T. DateKey, AVG (T. ValueField) OVER (ODER BY T. DateKey ASC ZWISCHEN 365 PRECEDING UND UND CURRENT ROW) AS YMAValueField VON DataTable AS T ORDER BY T. DateKey ASC Im Falle AVG ist eine der Aggregat-Funktionen nicht unterstützt Mit BETWEEN Bereich (ich weiß, SUM wird unterstützt). SELECT T. DateKey, SUM (T. ValueField) OVER (ODER BY T. DateKey ASC ZWISCHEN 365 PRÄZIEREN UND UND AKTUELLE REIHEN) CASE WHEN DATEDIFF (TAG, StartDate, T. DateKey) lt 365 DANN DATEDIFF (DAY, StartDate, T. DateKey) ELSE 365 END AS YMAValueField VON DataTable AS T ORDER BY T. DateKey ASC Abonnieren Sie weitere Artikel Fortnightly Newsletter helfen, schärfen Sie Ihre Fähigkeiten und halten Sie voran mit Artikeln, ebooks und Meinung, um Sie informiert zu halten. Wünschen Sie mehr Abonnieren Sie unseren vierzehntägigen Newsletter Besuchen Sie unsere Bibliothek von Artikeln, um die Muster und Praktiken zu entdecken, die Sie benötigen, um auf agilere Methoden der Datenbanklieferung zuzugreifen. Finden Sie heraus, wie Sie den Prozess des Bauens, Testens und der Bereitstellung Ihrer Datenbankänderungen automatisieren, um das Risiko zu reduzieren und den Lieferzyklus zu beschleunigen. Top bewertete aktuelle Artikel in T-SQL Programmierung Verwandte Artikel Auch in SQL Mit dem Aufstieg von NoSQL-Datenbanken, die Aspekte von SQL für die Abfrage ausnutzen und umfassende Transaktionalität umfassen, besteht die Gefahr, dass die Daten-Dokument-Modelle hierarchische Natur eine grundlegende Konflikt mit relationaler Theorie Wir haben unseren relationalen Experten gefragt, Hugh Bin-Haad, um einen schwierigen Bereich für Datenbank-Theoretiker zu erforschen. hellip Lesen Sie mehr Auch in SQL Server Jeder SQL Server-Datenbank-Programmierer muss mit den Systemfunktionen vertraut sein. Diese reichen von der sublimen (wie rowcount oder identity) zum lächerlichen (IsNumeric ()) Robert Sheldon bietet einen Überblick über die am häufigsten verwendeten them. hellip Lesen Sie mehr Auch in T-SQL-Programmierung Um voll nutzen zu können Der Systemkatalog, um mehr über eine Datenbank zu erfahren, müssen Sie mit den Metadatenfunktionen vertraut sein. Sie sparen viel Zeit und schreiben bei der Abfrage der Metadaten. Sobald Sie den Hang dieser Funktionen bekommen, scheint der Systemkatalog plötzlich einfach zu bedienen, wie Robert Sheldon in diesem Artikel demonstriert. hellip Lesen Sie mehr Auch in T-SQL Programmierung Eine Reihe von Argumenten mit Entwicklern, die darauf bestehen, dass Fuzzy-Suche oder Rechtschreibprüfung In der Anwendung stattfinden, dann eine relationale Datenbank inspiriert Phil Factor zu zeigen, wie es gemacht wird. Wenn die Datenbank relevante Inhalte aus den von den Benutzern eingegebenen Suchbegriffen finden muss, muss die Datenbank lernen, zu erwarten und zu behandeln, sowohl erwartete als auch unerwartete Hellip Lesen Sie mehr Kopie 2005 - 2017 Red Gate Software Ltd Was halten Sie von dem neuen Simple Talk Give Uns Ihr Feedback
Comments
Post a Comment