Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL erfordert Selbstbeitritt und Ranking

Wenn ich verstanden habe, was Sie wollen, können Sie dies mit Analysefunktionen und Fensterklauseln .

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;

Die innere Auswahl berechnet die Anzahl der Spiele und die Gesamtzahl der Tore in allen Spielen für jede Heim-/Auswärtsmannschaft in jeder Saison unter Verwendung der analytischen Version von count und sum , und die Fensterklausel rows between ... beschränkt beide auf die vorherigen fünf, mit Ausnahme der aktuellen Zeile, was meiner Meinung nach das ist, was Sie wollen. Die äußere Auswahl addiert dann die relevanten Summen für die beiden Teams in der aktuellen Reihe, überprüft aber beide Zählungen und lässt die Summe null, wenn eine von beiden <5 ist. Beachten Sie, dass sie nur die matches trifft Tabelle einmal.

Mit einem zusätzlichen Filter direkt vor dem Order-By:

where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'

... erhalten Sie:

    SEASON MATCHDATE HOMETEAM                  AWAYTEAM                   HOMEGOALS  AWAYGOALS TOTALGOALS
---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
      2012 13-MAY-12 Norwich                   Aston Villa                        2          0         30

Sie könnten dies verwenden, um die Tabelle für die übereinstimmende Zeile zu aktualisieren, obwohl ich sie im Allgemeinen nach Bedarf berechnen würde, um potenzielle Datenintegritätsfehler zu vermeiden, möglicherweise in einer Ansicht.