Als ik heb begrepen wat je wilt, kun je dit doen met analytische functies en vensterclausules .
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;
De inner select berekent het aantal wedstrijden en het totale aantal doelpunten voor elk thuis-/uitteam in elk seizoen, met behulp van de analytische versie van count
en sum
, en de vensterclausule rows between ...
beperkt beide tot de vorige vijf, met uitzondering van de huidige rij, waarvan ik denk dat dat is wat je wilt. De buitenste selectie telt dan de relevante totalen voor de twee teams in de huidige rij bij elkaar op, maar controleert beide tellingen en laat het totaal nul als een van beide <5 is. Merk op dat het alleen de matches
treft. tafel één keer.
Met een extra filter direct voor het bestellen:
where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'
... je krijgt:
SEASON MATCHDATE HOMETEAM AWAYTEAM HOMEGOALS AWAYGOALS TOTALGOALS
---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
2012 13-MAY-12 Norwich Aston Villa 2 0 30
Je zou dit kunnen gebruiken om de tabel voor de overeenkomende rij bij te werken, maar over het algemeen zou ik het zo nodig berekenen om mogelijke fouten in de gegevensintegriteit te voorkomen, mogelijk in een weergave.