Jeśli rozumiem, czego chcesz, możesz to zrobić za pomocą funkcje analityczne i klauzule okienkowe .
select season, matchdate, hometeam, awayteam, homegoals, awaygoals,
case when home_cnt >= 5 and away_cnt >= 5 then
home_tot + away_tot
else null end as totalgoals
from (
select season, matchdate, hometeam, awayteam, homegoals, awaygoals,
count(*) over (partition by season, hometeam
order by matchdate
rows between 5 preceding and 1 preceding) as home_cnt,
sum(homegoals + awaygoals) over (partition by season, hometeam
order by matchdate
rows between 5 preceding and 1 preceding) as home_tot,
count(*) over (partition by season, awayteam
order by matchdate
rows between 5 preceding and 1 preceding) as away_cnt,
sum(homegoals + awaygoals) over (partition by season, awayteam
order by matchdate
rows between 5 preceding and 1 preceding) as away_tot
from matches
)
order by season, matchdate, hometeam, awayteam;
Wewnętrzna selekcja oblicza liczbę meczów i całkowitą liczbę bramek w nich, dla każdej drużyny gospodarzy/gości w każdym sezonie, używając analitycznej wersji count
i sum
, a klauzula okna rows between ...
ogranicza oba do poprzednich pięciu, wyłączając bieżący wiersz, który moim zdaniem jest tym, czego chcesz. Zewnętrzny wybór następnie dodaje odpowiednie sumy dla dwóch drużyn w bieżącym wierszu, ale sprawdza obie liczby i pozostawia wartość pustą, jeśli któraś z nich wynosi <5. Zauważ, że trafia tylko na matches
stół raz.
Z dodatkowym filtrem bezpośrednio przed złożeniem zamówienia:
where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'
... otrzymujesz:
SEASON MATCHDATE HOMETEAM AWAYTEAM HOMEGOALS AWAYGOALS TOTALGOALS
---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
2012 13-MAY-12 Norwich Aston Villa 2 0 30
Możesz użyć tego do aktualizacji tabeli dla pasującego wiersza, chociaż generalnie obliczam to w razie potrzeby, aby uniknąć potencjalnych błędów integralności danych, prawdopodobnie w widoku.