Oracle
 sql >> Database >  >> RDS >> Oracle

SQL che richiede l'accesso automatico e la classificazione

Se ho capito cosa vuoi, puoi farlo con funzioni analitiche e clausole di windowing .

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;

La selezione interna calcola il numero di partite e il numero totale di gol su di esse, per ogni squadra di casa/fuori casa in ogni stagione, utilizzando la versione analitica di count e sum e la clausola della finestra rows between ... limita entrambi ai cinque precedenti, esclusa la riga corrente, che penso sia quello che vuoi. La selezione esterna somma quindi i totali rilevanti per le due squadre nella riga corrente, ma controlla entrambi i conteggi e lascia il totale nullo se uno dei due è <5. Nota che colpisce solo le matches tabella una volta.

Con un filtro aggiuntivo subito prima dell'ordine:

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

... ottieni:

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

Puoi usarlo per aggiornare la tabella per la riga corrispondente, anche se in genere la calcolerei secondo necessità per evitare potenziali errori di integrità dei dati, possibilmente in una vista.