Dies ist eine Evergreen Joe Celko Frage. Ich ignoriere, welche DBMS-Plattform verwendet wird. Aber auf jeden Fall Joe war in der Lage, mehr als 10 Jahren mit Standard-SQL zu beantworten. Joe Celko SQL-Puzzles und Antworten Zitat: Der letzte Update-Versuch deutet darauf hin, dass wir das Prädikat verwenden können, um eine Abfrage, die uns einen gleitenden Durchschnitt geben würde: Ist die zusätzliche Spalte oder die Abfrage Ansatz besser Die Abfrage ist technisch besser, weil die UPDATE-Ansatz wird Denormalisierung der Datenbank. Wenn jedoch die historischen Daten, die aufgezeichnet werden, sich nicht ändern und die Berechnung des gleitenden Durchschnitts kostspielig ist, könnten Sie die Verwendung des Spaltenansatzes in Erwägung ziehen. SQL Puzzle-Abfrage: mit allen Mitteln einheitlich. Sie werfen nur auf den entsprechenden Gewichtskorb je nach Entfernung vom aktuellen Zeitpunkt. Zum Beispiel quottake Gewicht1 für Datenpunkte innerhalb von 24 Stunden von aktuellen Datenpunkt Gewicht0,5 für Datenpunkte innerhalb von 48hrsquot. In diesem Fall ist es wichtig, wieviel aufeinander folgende Datenpunkte (wie 6:12 Uhr und 11:48 Uhr) voneinander entfernt sind. Ein Anwendungsfall, den ich mir vorstellen kann, wäre ein Versuch, das Histogramm zu glätten, wo Datenpunkte nicht dicht genug sind ndash msciwoj Mai 27 15 at 22:22 Im nicht sicher, dass Ihr erwarteten Ergebnis (Ausgang) zeigt klassische einfache bewegen (rolling) Durchschnitt für 3 Tage. Denn zum Beispiel gibt das erste Dreibettzimmer von Zahlen per Definition: aber man erwartet 4.360 und seine Verwirrung. Trotzdem schlage ich die folgende Lösung vor, die die Fensterfunktion AVG verwendet. Dieser Ansatz ist viel effizienter (klarer und weniger ressourcenintensiv) als SELF-JOIN in anderen Antworten eingeführt (und ich bin überrascht, dass niemand eine bessere Lösung gegeben hat). Sie sehen, dass AVG wird mit Fall verpackt, wenn rownum gt p. days dann zu zwingen, NULL s in ersten Zeilen, wo 3 Tage Moving Average ist sinnlos. Beantwortet Joe Celkos dirty linken äußeren Join-Methode (wie zitiert von Diego Scaravaggi) auf die Frage zu beantworten, wie es gefragt wurde. Generiert die angeforderte Ausgabe: Antwort # 2 am: Januar 21, 2010, um 10:33 Uhr Ihre Antwort 2017 Stack Exchange, IncUsing einen einfachen gleitenden Durchschnitt zu glätten Daten ist eine ziemlich beliebte Technik. Es ist zu schlecht das primäre Beispiel in der SQL Anywhere-Hilfe ist weit von einfach: Was macht dieses Beispiel so komplex Neben der Problem-Anweisung, das heißt: Berechnen Sie den gleitenden Durchschnitt aller Produktverkäufe, nach Monat, im Jahr 2000. Heres, was macht Es komplex: zwei Verweise auf die AVG () - Funktion, eine GROUP BY (die alle von sich selbst macht fast jede SELECT ein Kopf-Scratcher),. Eine Stealth-WINDOW-Klausel eine WINDOW-Klausel, die nicht sogar das WINDOW-Schlüsselwort verwendet. So dass die Uneingeweihte (die Leute, die Beispiele brauchen mehr als jeder andere) ist es nicht offensichtlich, dass ein WINDOW beteiligt ist überhaupt. Nicht nur eine WINDOW-Klausel, denken Sie daran, aber eine, die jede einzelne Komponente enthält, können Sie in einem WINDOW: eine PARTITION BY, eine RANGE-Klausel. Nicht eine einfache ROWS-Klausel, sondern eine vollwertige RANGE-Klausel, die eine intime Beziehung mit dem ORDER BY hat. Ich weiß, was eine Zeile ist, aber was die redacted ist ein RANGE Aber warten, theres mehr: Die Auswahl von RANGE über ROWS in diesem Beispiel ist entscheidend für die korrekte Operation der Abfrage. (Für eine ausführlichere Erörterung dieses speziellen Beispiels siehe Beispiel 23 - Berechnen eines bewegten Durchschnitts in Glenn Paulleys exzellentem OLAP-Weißbuch.) Jetzt können wir wieder auf den richtigen Weg zurückkehren: Ein wirklich einfacher gleitender Durchschnitt Das folgende Beispiel zeigt einen Wert von 10 Tagen an Daten zusammen mit dem gleitenden Durchschnitt von heutigem Wert und gestern: Die WINDOW-Klausel auf den Zeilen 21 bis 23 definiert ein sich bewegendes Fenster, das zwei Zeilen enthält: die heutige Zeile (CURRENT ROW) und die gestern Zeile (1 PRECEDING): die WINDOW ORDER BY-Klausel bestimmt was PRECEDING-Mittel (die vorhergehende Zeile durch t. entrydate) und die ROWS-Klausel bestimmt die Größe des Fensters (immer zwei Zeilen). Der Ausdruck AVG (t. value) OVER twodays auf Zeile 19 bezieht sich auf die WINDOW-Klausel nach Namen und weist SQL Anywhere an, den Durchschnitt der beiden Werte von t. value zu berechnen, die in dem 2-reihigen Schiebefenster vorhanden sind Zeile in der Ergebnismenge. Also, für 2012-02-02 der Durchschnitt von 10 und 20 ist 15.000000, für 2012-02-03 der Durchschnitt von 20 und 10 ist 15.000000, für 2012-02-04 der Durchschnitt von 10 und 30 ist 20.000000, für 2012- 02-10 der Durchschnitt von 10 und 60 ist 35.000000. Hoppla, was ist mit der ersten Zeile Die 2012-02-01 Zeile hat nicht eine PRECEDING Zeile, also was ist der Durchschnitt über das sich bewegende Fenster Laut Glenn Paulleys Weißbuch im Falle eines sich bewegenden Fensters, wird davon ausgegangen, dass Zeilen mit Null Werte existieren vor der ersten Zeile und nach der letzten Zeile in der Eingabe. Das bedeutet, wenn das sich bewegende Fenster 2012-02-01 als CURRENT ROW hat, enthält die Zeile 1 PRECEDING NULL-Werte. Und wenn SQL Anywhere ein AVG () berechnet, das einen NULL-Wert enthält, zählt es den NULL überhaupt nicht. Nicht im Zähler oder im Nenner bei der Berechnung des Durchschnitts. Heres Beweis: Thats, warum twodayaverage 10.000000 für die erste Reihe 2012-02-01. Geschrieben von Breck Carter um 3:47 PMAVG (Transact-SQL) ALL Wendet die Aggregatfunktion auf alle Werte an. ALL ist die Voreinstellung. DISTINCT Gibt an, dass AVG nur auf jeder eindeutigen Instanz eines Werts ausgeführt wird, unabhängig davon, wie oft der Wert auftritt. Expression Ein Ausdruck der exakten numerischen oder approximativen numerischen Datentyp-Kategorie mit Ausnahme des Bitdatentyps. Aggregatfunktionen und Unterabfragen sind nicht zulässig. OVER (partitionbyclaususe orderbyclause) partitionbyclause teilt die von der FROM-Klausel erzeugte Ergebnismenge in Partitionen, auf die die Funktion angewendet wird. Wenn nicht angegeben, behandelt die Funktion alle Zeilen der Abfrageergebnismenge als einzelne Gruppe. Orderbyclause bestimmt die logische Reihenfolge, in der die Operation ausgeführt wird. Eine Nachbestellung ist erforderlich. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL). Der Rückgabetyp wird durch den Typ des ausgewerteten Ergebnisses des Ausdrucks bestimmt. Dezimal-Klasse (p, s) Ist der Datentyp des Ausdrucks ein Alias-Datentyp, so ist auch der Rückgabetyp vom Alias-Datentyp. Wenn jedoch der Basisdatentyp des Alias-Datentyps gefördert wird, beispielsweise von tinyint nach int. Ist der Rückgabewert vom geförderten Datentyp und nicht vom Alias-Datentyp. AVG () berechnet den Durchschnitt eines Wertsatzes, indem er die Summe dieser Werte durch die Anzahl der Nichtnullwerte dividiert. Wenn die Summe den Maximalwert für den Datentyp des Rückgabewertes überschreitet, wird ein Fehler zurückgegeben. AVG ist eine deterministische Funktion, wenn sie ohne die OVER - und ORDER BY-Klauseln verwendet wird. Sie ist nicht deterministisch, wenn sie mit den OVER - und ORDER BY-Klauseln angegeben ist. Weitere Informationen finden Sie unter Deterministische und nicht-deterministische Funktionen. A. Verwenden der SUM - und AVG-Funktionen für Berechnungen Das folgende Beispiel berechnet die durchschnittlichen Urlaubszeiten und die Summe der Krankenstunden, die die Vizepräsidenten von Adventure Works Cycles verwendet haben. Jede dieser Aggregatfunktionen erzeugt einen einzigen Summenwert für alle abgerufenen Zeilen. Das Beispiel verwendet die AdventureWorks2012-Datenbank.
No comments:
Post a Comment