3

私は昨日同様の質問をしましたが、正しく答えられました。自己結合とランキングを必要とする SQL この質問は似ていますが、答えを適合させることができません。

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

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

INSERT ステートメントはここにあります: https://gist.github.com/2941229

次のように totalGoals の値を計算したいと思います。これは、現在のホーム チームがプレーした直近 5 試合で得点した合計ゴール数 (homeGoals+awayGoals) に、現在の試合前に現在のアウェイ チームがプレーした直近 5 試合で得点したゴール数を加えたものです。現在の試合のゴールを含めてはなりません。

昨日の質問との違いは、ホームチームがホームでプレーし、アウェイチームがアウェイでプレーした過去の試合のみをカウントしたことです。この質問では、ホームチームが以前にホームでプレーしたかアウェイでプレーしたかは問題ではありません。彼らは、その前の試合のチームの 1 つでなければなりませんでした。

以前と同様に、現在のシーズンの試合のみを使用する必要があり、いずれかのチームがシーズン中に 5 試合を行っていない場合、totalGoals は NULL のままにする必要があります。

PL/SQL を使用してこれを行うことができますが、SQL クエリの方がはるかに好ましいと思います。昨日のソリューションは、PL/SQL よりも約 1000 倍高速でした。

ありがとうタムズ

4

1 に答える 1

3

基本的に、ホーム/アウェイチームの計算に何らかの「または」を導入できるようにする必要がありますが、(私の知る限り)分析関数内でそれを行うことはできません。いずれかのチーム名を持つ追加の計算列を持つ中間テーブル (クエリ中にのみ存在するため、より多くのビューがあると思います) を作成する必要があるようです。そのために使用できますunpivotが、まだ必要な元の列が失われます。したがって、次のような 11g より前の疑似アンピボットにフォールバックできます。

select season, matchdate, hometeam, awayteam, homegoals, awaygoals,
    case when rn = 1 then hometeam else awayteam end as anyteam
from matches
cross join (select level as rn from dual connect by level <= 2)

これにより、元のテーブルのすべての行に対して 2 つの行が得られます。昨日の回答の代わりに(別の)サブクエリとして使用しmatches、分析句を微調整し、重複を削除することができるはずです。

于 2012-06-17T10:06:20.160 に答える