あなたが何を望んでいるのか理解できたら、分析関数とウィンドウ句でこれを行うことができます。
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;
内側の select は、各シーズンのホーム/アウェイ チームごとに、 と の分析バージョンを使用して、試合の数と合計ゴール数を計算しcount
ますsum
。ウィンドウ句rows between ...
は、現在の行を除いて、両方を前の 5 つに制限します。私はあなたが望むものだと思います。外側の select は、現在の行の 2 つのチームの関連する合計を合計しますが、両方のカウントをチェックし、どちらかが < 5 の場合は合計を null のままにしmatches
ます。テーブルにヒットするのは 1 回だけであることに注意してください。
order-by の直前にフィルターを追加すると、次のようになります。
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
これを使用して、一致する行のテーブルを更新できますが、通常は、おそらくビューでの潜在的なデータ整合性エラーを回避するために、必要に応じて計算します。