Ако съм разбрал какво искате, можете да направите това с аналитични функции и клаузи за прозорци .
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;
Вътрешният избор изчислява броя на мачовете и общия брой голове в тях за всеки отбор домакин/гостуващ във всеки сезон, използвайки аналитичната версия на count
и sum
и клаузата за прозорец rows between ...
ограничава и двете до предишните пет, с изключение на текущия ред, което според мен е това, което искате. Външният избор след това добавя съответните общи суми за двата отбора в текущия ред, но проверява и двата броя и оставя общата сума нула, ако някоя от тях е <5. Обърнете внимание, че удря само matches
маса веднъж.
С допълнителен филтър непосредствено преди подреждането по:
where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'
... получавате:
SEASON MATCHDATE HOMETEAM AWAYTEAM HOMEGOALS AWAYGOALS TOTALGOALS
---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
2012 13-MAY-12 Norwich Aston Villa 2 0 30
Можете да използвате това, за да актуализирате таблицата за съвпадащия ред, въпреки че по принцип бих го изчислил според нуждите, за да избегна потенциални грешки в целостта на данните, вероятно в изглед.