अगर मुझे समझ में आ गया है कि आप क्या चाहते हैं, तो आप इसे विश्लेषणात्मक कार्य और विंडो खंड ।
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
आप इसका उपयोग मिलान पंक्ति के लिए तालिका को अपडेट करने के लिए कर सकते हैं, हालांकि आम तौर पर मैं संभावित डेटा अखंडता त्रुटियों से बचने के लिए आवश्यकतानुसार इसकी गणना करता हूं, संभवतः एक दृश्य में।