Oracle
 sql >> Base de données >  >> RDS >> Oracle

SQL nécessitant une auto-jointure et un classement

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.