2016-06-02 11 views
1

Ich habe gekämpft, um einen Datensatz einen gleitenden Durchschnitt hinzuzufügen. Hier ist, was ich muss arbeiten mit:Computing Moving Average und Aktualisierung

ID, SamplerName, CreatedOn, Average, MovingAverage 
1, type A, 05/01/2016,  100,  null 
2, type B, 05/01/2016,  110,  null 
3, type A, 05/02/2016,  105,  null 
4, type B, 05/02/2016,  102,  null 

Dies ist ein sehr vereinfachtes Beispiel für meine Daten, in Wirklichkeit habe ich etwa 15 SamplerNames und es ist möglich, in die Zukunft zu ändern.

Ich habe versucht, einen Cursor in einer Schleife durch die Liste, indem Sie einen Auswahl verschiedene auf dem Sampler Label in der Tabelle dann die MovingAverage Aktualisierung erzeugt die Einrichtung von AVG([Average]) OVER (ORDER BY [CreatedOn] ROWS UNBOUNDED PRECEDING) etwas Ähnliches wie zu tun, aber ich lief in den Fehler

"Fensterfunktionen können nur in Select- oder Order-by-Klauseln erscheinen".

Ich habe eine Reihe anderer Lösungen ausprobiert, aber ich kann es nicht genau herausfinden und ich hoffte, dass jemand mir eine Hand geben könnte.

+0

Sie oft berechnen können gleitenden Durchschnitt zur vorherigen Aufzeichnungen mit JOIN, dann AVG Verwendung auf den früheren Aufzeichnungen ausgewählt, aber ich bin mir nicht sicher, was genau deine Definition von gleitendem Durchschnitt ist hier. – Cato

+0

@JaydipJ Ich bin mir nicht sicher, ob ich deinen Kommentar verstehe. Der gleitende Durchschnitt, den ich berechnen möchte, ist der gleitende Durchschnitt aller vorherigen SamplerNames. So sollte zum Beispiel die erste Instanz von TypeA, die am 1.5.2015 erstellt wurde, einen gleitenden Durchschnitt von 100 haben und TypeA am 5. 2. 2016 erstellt werden sei (100 +105)/2. TypeB wäre ähnlich und die Berechnungen auf den TypB SamplerNames beschränkt. – Austin

Antwort

0

Die Zeilen/Bereich Klausel wurde in SQL Server 2008 eingeführt. Wenn Sie 2008+ verwenden, sind Sie nicht das partition by SamplerName

avg(Average) over (partition by SamplerName order by CreatedOn rows unbounded preceding) 

Beispiel:

declare @T table (ID int, SamplerName varchar(6), CreatedOn datetime, Average float) 

insert into @T (ID, SamplerName, CreatedOn, Average) 
select 1, 'type A', '2016-05-01', 100 union all 
select 2, 'type B', '2016-05-01', 110 union all 
select 3, 'type A', '2016-05-02', 105 union all 
select 4, 'type B', '2016-05-02', 102 


select *, 
    avg(Average) over (partition by SamplerName order by CreatedOn rows unbounded preceding) 
from @T 
+0

Du hast Recht, mir fehlte die Partition in meiner Over-Klausel. Ich konnte diese Durchschnittsberechnung einfach in die gespeicherte Prozedur verschieben, die Daten in meine Berichtsdatenbank verschiebt und die Berechnung ohne die Notwendigkeit einer späteren Aktualisierung erhält. – Austin

0

Sie können einen aktualisierbaren CTE verwenden:

with toupdate as (
     select t.*, 
      avg(average) over (partition by sampler order by createdon) as new_movingaverage 
     from t 
    ) 
update toupdate 
    set movingaverage = new_movingaverage; 
+0

bekommen "ungültiger Spaltenname 'new_movingAverage'." – Austin

+0

@Austin. . . Dieser Fehler macht keinen Sinn. Die Spalte ist im CTE definiert. –