Wenn Sie möchten, dass die Fenstergröße leicht geändert werden kann, dann wäre die Implementierung wesentlich anders.
(Bitte beachten Sie, dass ich das in sql-server entwickelt, weil ich nicht bewusst bin von jeder Website, die ich hive SQL testen kann. Sie müssen möglicherweise einige Syntax zwicken.)
Declare @thisManyRows int = 3;
With rowNumber_cte As (
Select
id,
[Value],
RowNo = Row_Number() Over (Order By id)
From Table1),
windows_cte As (
Select
b_id = b.id,
j_id = j.id,
j.[Value],
RowNo2 = @thisManyRows + 1 - Row_Number() Over (Partition By b.id Order By j.id desc),
n = Count(j.[Value]) Over (Partition By b.id)
From rowNumber_cte As b
Join rowNumber_cte As j On j.RowNo Between b.RowNo - @thisManyRows + 1 And b.RowNo)
Select
id = b_id,
[Value] = Sum(Case When b_id = j_id Then [Value] Else Null End),
WeightedAverage = Sum([Value] * 1.0 * (RowNo2 *1.0/@thisManyRows))/Min(n)
From windows_cte
Group By b_id;
Ich werde, was zu erklären, Dies geschieht, weil es ein bisschen kryptisch ist:
- Setzen Sie die Variable auf die Anzahl der Zeilen, die für den gleitenden Durchschnitt berücksichtigt werden sollen (einschließlich der aktuellen Zeile).
- In der
rowNumber_cte
vergeben wir eine Zeilennummer, wir tun dies, weil wir nicht davon ausgehen, dass id
wird sequenziell sein.
- Im
windows_cte
wir die rowNumber_cte
auf sich selbst verbinden, so dass jede Zeile auf alle Zeilen verbunden ist, dass es Fenster der Berechnung bilden (mit Bezug auf die @thisManyRows
Variable. Diese CTE führt auch ein neues RowNo2
Feld, das im Grunde endet der Zähler der Bruchzahl, für die der Wert dieser Zeile zum gewichteten gleitenden Durchschnitt beiträgt (dh die aktuelle Zeile hat RowNo2 = 4
und ein 4/4-Gewicht)
windows_cte
berechnet auch die Anzahl von Zeilen in dem Fenster, um Zeilen am Anfang der Daten, die kein volles Fenster haben, besser zu behandeln
- Die endgültigen Auswahlgruppen von
id
multipliziert die [Value]
jeder Zeile im Fenster mit seinem Gewicht und teilt sie dann durch die Anzahl der Zeilen im Fenster: n
.
Können Sie die Logik für 'gewollte' Spalte erklären? –
Was bekommen Sie von der Abfrage? –
Vielen Dank für Anregungen, siehe aktualisierte Frage –