Wyliczanie średniej dla poprzedzających zdarzeń.

0

Witam,
chciałbym wyliczać dla każdego rekordu, średnią wartość ze zdarzeń które spełniają odpowiednie warunki. A więc tak tabel wygląda tak:
DATA TYP WYNIK
01.01.2016 a 3,2
02.01.2016 b 2,5
03.01.2016 a 1,5
04.01.2016 a 2,6
05.01.2016 b 5,4
06.01.2016 b 8
07.01.2016 b 1
08.01.2016 a 2,3
09.01.2016 a 2,1
10.01.2016 a 2,5
11.01.2016 a 1,2
i teraz to każdego rekordu chciałbym dopisać średnią wartość z kolumny (wynik) z 3 zdarzeń poprzedzających dane zdarzenie. Czyli np chciałbym żeby dla rekordu z datą 07.01.2016 mógł dopisać wartość z wyliczoną średnią z datą wczesniejsza niż 07.01.2016 oraz z typem b (w naszym przypadku z lini (2,5,6).

ROW_NUMBER() OVER (PARTITION BY typ ORDER BY data) AS row_id - dzięki temu dopisałem interesujące mnie miejsce danej lini w sekwencji zdarzeń po dacie dla danego typu. Teraz jak dopisać średnia wyników do danej lini gdzie typ=typ and row id beetween(row_id -1, row_id -3)

dziekuję i pozdarawiam

1
AVG(wynik) OVER (PARTITION BY typ ORDER BY data
  ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING)
0

Dziękuję bardzo, kombinowałem i byłem w trakcie tworzenia procedury już, ale widzę że kompletnie niepotrzebnie :) a żeby zmodyfikować i 3 kolejne zdarzenia wystarczy po order dopisać desc?

  • nie było pytania sprawdziłem i wszystko działa :)
0
zz napisał(a):
AVG(wynik) OVER (PARTITION BY typ ORDER BY data
  ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING)

a jeśli rozwinąłbym tabele i dodał kolumnę i tabela by wyglądała tak przykładowo:

DATA TYP TYP_2 WYNIK
01.01.2016 a c 3,2
02.01.2016 b c 2,5
03.01.2016 a b 1,5
04.01.2016 a b 2,6
05.01.2016 b c 5,4
06.01.2016 b a 8
07.01.2016 b a 1
08.01.2016 a b 2,3
09.01.2016 a c 2,1
10.01.2016 a b 2,5
11.01.2016 a c 1,2

i tak jak w poprzednim wyliczało średnią dla 3 ostatnich zdarzeń dla danego typu z kolumny (typ). Teraz chciałbym by wyliczało średnią dla danej lini i danego typu średnią z trzech ostatnich zdarzeń gdzie data < data_zdarzenia i (typ=typ_zdarzenia(z kolumny typ) lub typ_2=typ_zdarzenia(z kolumny typ)). Da się coś takiego wykonać?

0

wymyśliłem takie rozwiązanie:

tworzę tabele gdzie typ=typ_2 i typ_2=typ i dodaje kolumne temp=1;
create table dane_temp as
select
data,
typ as typ_2,
typ_2 as typ,
wynik
from dane;
2.

teraz robię uniona tabeli źródłowej i utworzonej;
select * from dane
union
select * from dane_temp
3.
zapuszczam
AVG(wynik) OVER (PARTITION BY typ ORDER BY DATA
ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING);
4.
usuwam rekordy gdzie temp=1
delete * from dane where temp = 1;

rozwiązanie nie jest chyba zbyt zoptymalizowane ponieważ przy dużej ilości danych podwaja dane.

Czy istnieje inne rozwiązanie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1