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

SQL kræver selvtilslutning og rangering

Hvis jeg har forstået, hvad du vil, kan du gøre dette med analytiske funktioner og vinduesklausuler .

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;

Det indre udvalg beregner antallet af kampe og det samlede antal mål på tværs af dem, for hvert hjemme-/udehold i hver sæson, ved hjælp af den analytiske version af count og sum , og vinduesklausulen rows between ... begrænser begge til de foregående fem, eksklusive den nuværende række, som jeg tror er, hvad du ønsker. Det ydre udvalg lægger derefter de relevante totaler sammen for de to hold i den aktuelle række, men kontrollerer begge tællinger og efterlader det samlede antal nul, hvis begge er <5. Bemærk, at det kun rammer matches bord én gang.

Med et ekstra filter umiddelbart før ordre-by:

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

... du får:

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

Du kan bruge dette til at opdatere tabellen for den matchende række, selvom jeg generelt ville beregne det efter behov for at undgå potentielle dataintegritetsfejl, muligvis i en visning.



  1. PostgreSQL - Tilføj nøgle til hvert objekt i et JSONB-array

  2. Kan ikke oprette forbindelse til MySQL-serveren på '127.0.0.1' (10061) (2003)

  3. Returner en liste over partitionsfunktioner i SQL Server (T-SQL)

  4. Få opdateret værdi i MySQL i stedet for berørte rækker