sql >> Databasteknik >  >> RDS >> Oracle

SQL som kräver självanslutning och rankning

Om jag har förstått vad du vill kan du göra detta med analytiska funktioner och fönsterklausuler .

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 inre urvalet beräknar antalet matcher och det totala antalet mål över dem, för varje hemma-/bortalag under varje säsong, med hjälp av den analytiska versionen av count och sum , och fönstersatsen rows between ... begränsar båda till de föregående fem, exklusive den nuvarande raden, vilket jag tror är vad du vill. Den yttre markeringen lägger sedan ihop de relevanta totalsummorna för de två lagen i den aktuella raden, men kontrollerar båda antalet och lämnar totalsumman null om någon av dem är <5. Observera att den bara träffar matches bord en gång.

Med ett extra filter omedelbart före order-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 använda detta för att uppdatera tabellen för den matchande raden, men i allmänhet skulle jag beräkna det efter behov för att undvika potentiella dataintegritetsfel, möjligen i en vy.



  1. MySQL-jämförelse med nullvärde

  2. Returnera booleskt värde som TRUE eller FALSE i Select (PostgreSQL/pgAdmin)

  3. Hurliga tweets om livet för en DBA

  4. Hur man formaterar siffror i PostgreSQL