sql >> Database >  >> RDS >> Oracle

SQL vereist self-join en ranking

Als ik heb begrepen wat je wilt, kun je dit doen met analytische functies en vensterclausules .

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;

De inner select berekent het aantal wedstrijden en het totale aantal doelpunten voor elk thuis-/uitteam in elk seizoen, met behulp van de analytische versie van count en sum , en de vensterclausule rows between ... beperkt beide tot de vorige vijf, met uitzondering van de huidige rij, waarvan ik denk dat dat is wat je wilt. De buitenste selectie telt dan de relevante totalen voor de twee teams in de huidige rij bij elkaar op, maar controleert beide tellingen en laat het totaal nul als een van beide <5 is. Merk op dat het alleen de matches treft. tafel één keer.

Met een extra filter direct voor het bestellen:

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

... je krijgt:

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

Je zou dit kunnen gebruiken om de tabel voor de overeenkomende rij bij te werken, maar over het algemeen zou ik het zo nodig berekenen om mogelijke fouten in de gegevensintegriteit te voorkomen, mogelijk in een weergave.



  1. MariaDB 5.5 upgraden naar MariaDB 10.1 op CentOS/RHEL 7 en Debian-systemen

  2. SQL Server 2008 - volgorde op tekenreeksen met numeriek nummer

  3. Een SQLite-clientdatabase synchroniseren met een MySQL-serverdatabase

  4. Hoe het *.sql mysql-bestand uit te voeren in mijn c#-toepassing