Oracle
 sql >> Baza danych >  >> RDS >> Oracle

SQL wymagający samodzielnego łączenia i rankingu

Jeśli rozumiem, czego chcesz, możesz to zrobić za pomocą funkcje analityczne i klauzule okienkowe .

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;

Wewnętrzna selekcja oblicza liczbę meczów i całkowitą liczbę bramek w nich, dla każdej drużyny gospodarzy/gości w każdym sezonie, używając analitycznej wersji count i sum , a klauzula okna rows between ... ogranicza oba do poprzednich pięciu, wyłączając bieżący wiersz, który moim zdaniem jest tym, czego chcesz. Zewnętrzny wybór następnie dodaje odpowiednie sumy dla dwóch drużyn w bieżącym wierszu, ale sprawdza obie liczby i pozostawia wartość pustą, jeśli któraś z nich wynosi <5. Zauważ, że trafia tylko na matches stół raz.

Z dodatkowym filtrem bezpośrednio przed złożeniem zamówienia:

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

... otrzymujesz:

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

Możesz użyć tego do aktualizacji tabeli dla pasującego wiersza, chociaż generalnie obliczam to w razie potrzeby, aby uniknąć potencjalnych błędów integralności danych, prawdopodobnie w widoku.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaimplementować ten wyzwalacz w Oracle SQL?

  2. org.hibernate.tool.schema.spi.CommandAcceptanceException:nie można wykonać polecenia

  3. Oracle DBMS_LOB.INSTR i zawiera wydajność

  4. Jak agregować bez użycia `GROUP BY`?

  5. Jak wyodrębnić tylko wartość daty z pola daty w Oracle?