sql >> Databáze >  >> RDS >> Oracle

SQL vyžadující vlastní připojení a hodnocení

Pokud jsem pochopil, co chcete, můžete to udělat pomocí analytické funkce a ustanovení o používání oken .

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;

Vnitřní výběr vypočítá počet zápasů a celkový počet gólů v nich pro každý tým doma/venku v každé sezóně pomocí analytické verze count a sum a klauzule okna rows between ... omezuje obojí na předchozích pět, kromě aktuálního řádku, což je podle mě to, co chcete. Vnější výběr pak sečte příslušné součty dohromady pro dva týmy v aktuálním řádku, ale zkontroluje oba počty a ponechá součet nula, pokud je kterýkoli z nich <5. Všimněte si, že se trefí pouze do matches stůl jednou.

S přídavným filtrem bezprostředně před objednávkou:

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

... získáte:

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

Můžete to použít k aktualizaci tabulky pro odpovídající řádek, i když obecně bych to vypočítal podle potřeby, abych se vyhnul potenciálním chybám integrity dat, případně v pohledu.



  1. Instalace MySQLdb na Mac OS X

  2. preg_replace() nenajde koncový oddělovač?

  3. MySQL drop tabulky se zástupným znakem pouze pomocí SQL příkazu?

  4. vBulletin jako přihlášení pro celý web (upravit:bylo dosaženo určitého pokroku)