Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL изисква самостоятелно присъединяване и класиране

Ако съм разбрал какво искате, можете да направите това с аналитични функции и клаузи за прозорци .

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;

Вътрешният избор изчислява броя на мачовете и общия брой голове в тях за всеки отбор домакин/гостуващ във всеки сезон, използвайки аналитичната версия на count и sum и клаузата за прозорец rows between ... ограничава и двете до предишните пет, с изключение на текущия ред, което според мен е това, което искате. Външният избор след това добавя съответните общи суми за двата отбора в текущия ред, но проверява и двата броя и оставя общата сума нула, ако някоя от тях е <5. Обърнете внимание, че удря само matches маса веднъж.

С допълнителен филтър непосредствено преди подреждането по:

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

... получавате:

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

Можете да използвате това, за да актуализирате таблицата за съвпадащия ред, въпреки че по принцип бих го изчислил според нуждите, за да избегна потенциални грешки в целостта на данните, вероятно в изглед.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Database BLOB към InputStream в Java?

  2. Извличане на фиксиран брой редове в SQL заявка в Oracle

  3. Маскиране на номера и nls_параметър

  4. Съветникът за модел на данни на обект получава изключение, когато се опитва да добави нова Oracle връзка

  5. Oracle:Как да открием прекратяване на процес на клиент, както работи за sqlplus?