Si j'ai bien compris ce que vous voulez, vous pouvez le faire avec fonctions analytiques et clauses de fenêtrage .
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;
L'inner select calcule le nombre de matchs et le nombre total de buts à travers eux, pour chaque équipe à domicile/à l'extérieur de chaque saison, en utilisant la version analytique de count
et sum
, et la clause window rows between ...
limite les deux aux cinq précédents, à l'exclusion de la ligne actuelle, ce qui, je pense, est ce que vous voulez. La sélection externe ajoute ensuite les totaux pertinents pour les deux équipes de la ligne actuelle, mais vérifie les deux comptes et laisse le total nul si l'un ou l'autre est <5. Notez qu'il ne touche que les matches
table une fois.
Avec un filtre supplémentaire juste avant le tri :
where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'
... vous obtenez :
SEASON MATCHDATE HOMETEAM AWAYTEAM HOMEGOALS AWAYGOALS TOTALGOALS
---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
2012 13-MAY-12 Norwich Aston Villa 2 0 30
Vous pouvez l'utiliser pour mettre à jour la table pour la ligne correspondante, bien que généralement je la calcule au besoin pour éviter les erreurs potentielles d'intégrité des données, éventuellement dans une vue.