0

次のテーブルがあるとします。

TABLE Car
car_id
num

TABLE Car_description
dsc_id
car_id
model

TABLE Result
res_id
car_id
race_num
result

タスクは、2 台以上の車があるレースの最大平均スコアと、最高の車の Car.num, Car_description.model を選択することです。これを解決する 1 つの方法は、次のクエリを記述することです。

select r.race_num,
       MAX(score) as MaxScore,
       AVG(score) as AvgScore,
       MAX(case when seqnum = 1 then c.carnum end) as TopCarNum,
       MAX(case when seqnum = 1 then cd.model end) as TopCarModel
from (select r.*,
             ROW_NUMBER() over (partition by race_num order by score desc) as seqnum
      from Result r
     ) r left outer join
     Car c
     on c.car_id = r.car_id left outer join
     Car_Description cd
     on c.car_id = d.car_id
group by r.race_num
having COUNT(*) > 2

しかし、ここでは、最大要素を選択するのではなく、内部クエリで結果テーブルのソートを実行します。時間がかかると思います。そうですか?これを最適化するにはどうすればよいでしょうか。ありがとう。

4

1 に答える 1

1

これがパフォーマンスに役立つかどうかはわかりませんが、試してみてください

SELECT r.race_num,
   MAX(score) as MaxScore,
   AVG(score) as AvgScore,
   MAX(case when mr.max_score IS NOT NULL then c.carnum end) as TopCarNum,
   MAX(case when mr.max_score IS NOT NULL then cd.model end) as TopCarModel
FROM Result LEFT OUTER JOIN 
    (SELECT r.race_num, MAX(score) max_score FROM Result r GROUP BY r.race_num) mr 
    ON Result.res_num = mr.res_num AND Result.score = mr.max_score
 LEFT OUTER JOIN Car c
 ON c.car_id = Result.car_id 
 LEFT OUTER JOIN Car_Description cd
 ON c.car_id = d.car_id
 GROUP BY r.race_num
 HAVING COUNT(*) > 2
于 2012-09-05T16:46:26.777 に答える