Om jag har förstått vad du vill kan du göra detta med analytiska funktioner och fönsterklausuler .
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;
Det inre urvalet beräknar antalet matcher och det totala antalet mål över dem, för varje hemma-/bortalag under varje säsong, med hjälp av den analytiska versionen av count
och sum
, och fönstersatsen rows between ...
begränsar båda till de föregående fem, exklusive den nuvarande raden, vilket jag tror är vad du vill. Den yttre markeringen lägger sedan ihop de relevanta totalsummorna för de två lagen i den aktuella raden, men kontrollerar båda antalet och lämnar totalsumman null om någon av dem är <5. Observera att den bara träffar matches
bord en gång.
Med ett extra filter omedelbart före order-by:
where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'
... du får:
SEASON MATCHDATE HOMETEAM AWAYTEAM HOMEGOALS AWAYGOALS TOTALGOALS
---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
2012 13-MAY-12 Norwich Aston Villa 2 0 30
Du kan använda detta för att uppdatera tabellen för den matchande raden, men i allmänhet skulle jag beräkna det efter behov för att undvika potentiella dataintegritetsfel, möjligen i en vy.