1

私はサッカーの結果の表を持っています:

    CREATE TABLE matches(
    season NUMBER(4),
    matchDate DATE,
    homeTeam VARCHAR2(25),
    awayTeam VARCHAR2(25),
    homeGoals NUMBER(2),
    awayGoals NUMBER(2),
    totalGoals NUMBER(3));

行ごとに、totalGoals列を更新したいと思います。は、ホームで行われた直近 5 試合のtotalGoals得点 ( homeGoals+ ) と、アウェイで行われた直近 5 試合の得点を加算して計算されます。awayGoalshomeTeamawayTeam

同じシーズンの試合のみを使用して得点を計算します。現在の行で得点したゴールは含まれません。いずれかのチームがシーズン中に必要な試合数をプレーしていない場合、totalGoalsNULL のままです。

PL/SQLを使用してこれを更新できますが、SQLのみを使用してこれを行う方法はありますか?

4

2 に答える 2

2

あなたが何を望んでいるのか理解できたら、分析関数ウィンドウ句でこれを行うことができます。

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;

内側の select は、各シーズンのホーム/アウェイ チームごとに、 と の分析バージョンを使用して、試合の数と合計ゴール数を計算しcountますsum。ウィンドウ句rows between ...は、現在の行を除いて、両方を前の 5 つに制限します。私はあなたが望むものだと思います。外側の select は、現在の行の 2 つのチームの関連する合計を合計しますが、両方のカウントをチェックし、どちらかが < 5 の場合は合計を null のままにしmatchesます。テーブルにヒットするのは 1 回だけであることに注意してください。

order-by の直前にフィルターを追加すると、次のようになります。

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

これを使用して、一致する行のテーブルを更新できますが、通常は、おそらくビューでの潜在的なデータ整合性エラーを回避するために、必要に応じて計算します。

于 2012-06-16T15:40:44.290 に答える
0

MySQLで次のことを試しましたが、「エラーコード:1093。FROM句で更新するターゲットテーブル'm'を指定できません」で失敗しました。

たぶん、Oracleで試すことができます。「limit0,5」句を、行数を制限するOracle固有の方法に置き換える必要があります。彼らは「rownum<6」を使っていると思います。

update matches m
  set totalGoals = (select sum(homeGoals) + sum(awayGoals) 
                      from matches
                      where homeTeam = m.homeTeam
                        and season = m.season
                        and matchDate < m.matchDate
                      having count(matchDate) > 4
                      order by matchDate limit 0,5) +
                   (select sum(homeGoals) + sum(awayGoals) 
                      from matches
                      where awayTeam = m.awayTeamm
                        and season = m.season
                        and matchDate < m.matchDate
                      having count(matchDate) > 4
                      order by matchDate limit 0,5);
于 2012-06-16T12:45:45.873 に答える