Se eu entendi o que você quer, você pode fazer isso com funções analíticas e cláusulas de janela .
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;
A seleção interna calcula o número de partidas e o número total de gols entre elas, para cada time da casa/fora em cada temporada, usando a versão analítica de
count
e sum
, e a cláusula de janela rows between ...
limita ambos aos cinco anteriores, excluindo a linha atual, que acho que é o que você deseja. A seleção externa adiciona os totais relevantes juntos para as duas equipes na linha atual, mas verifica ambas as contagens e deixa o total nulo se um deles for <5. Observe que ele atinge apenas os matches
mesa uma vez. Com um filtro adicional imediatamente antes do pedido:
where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'
... você recebe:
SEASON MATCHDATE HOMETEAM AWAYTEAM HOMEGOALS AWAYGOALS TOTALGOALS
---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
2012 13-MAY-12 Norwich Aston Villa 2 0 30
Você pode usar isso para atualizar a tabela para a linha correspondente, embora geralmente eu calcule conforme necessário para evitar possíveis erros de integridade de dados, possivelmente em uma exibição.