3

www.db-class.com の演習問題を解いています。遅くなりましたが、質問はまだ興味深いものです。エキストラで最後のタスクを偶然見つけましたが、解決策がわかりません。

SQL スキームは次のとおりです。

create table Movie(mID int, title text, year int, director text);
create table Reviewer(rID int, name text); 
create table Rating(rID int, mID int, stars int, ratingDate date);

データベース全体はここから取得できます

質問は次のとおりです。

Q12 各監督について、監督の名前と、その監督が監督したすべての映画の中で最高の評価を受けた映画のタイトルと、その評価の値を返してください。監督が NULL の映画を無視します。

より具体的な詳細を説明するには、ここで何が問題なのか:

1 つのクエリ

select m.mid, m.title, max(r.stars) as stars 
from rating r natural join movie m 
where m.director is NOT NULL group by m.mid

最も評価の高い映画の ID を返します。

101 Gone with the Wind       4
103 The Sound of Music       3
104 E.T.                     3
107 Avatar                   5
108 Raiders of the Lost Ark  4

別のクエリ

select m.director, max(r.stars) as stars 
from rating r natural join movie m 
where m.director is NOT NULL group by m.director 

最も評価の高い映画を持つ監督の名前を返します。

James Cameron       5
Robert Wise         3
Steven Spielberg    4
Victor Fleming      4

クエリに参加して、監督の最も評価の高い映画の名前と星を取得する方法:

James Cameron      Avatar                   5
Robert Wise        The Sound of Music       3
Steven Spielberg   Raiders of the Lost Ark  4
Victor Fleming     Gone with the Wind       4
4

2 に答える 2

2

私の意見では、これは単なるグループごとのgretest-nの問題です。そのためのタグさえあります:)

通常の状況との唯一の違いは、グループ化データ (ディレクター) が 1 つのテーブルにあり、比較に使用されるデータが別のテーブル (スター) にあることです。そのため、そのようにタグ付けされた質問を見ると、同様の例が見つかるはずです。

すべてのデータが1つのテーブルにあると仮定して、最初に解決することをお勧めします(ひどいですが、解決するのは簡単です...少なくとも私にとっては)。そして、分割されたデータに切り替えます。

ネタバレ:

これが解決方法だと思いますので、すでに解決策を提案している場合にのみ見てください。

select distinct m1.director, m1.title, r1.stars from movie m1
join rating r1 on m1.mID = r1.mID
left join (
    select m2.director, r2.stars from movie m2
    join rating r2 on m2.mID = r2.mID
) s on m1.director = s.director and r1.stars < s.stars
where s.stars is null and m1.director is not null
于 2012-04-11T06:26:57.993 に答える
0

提案:

  1. すべてのディレクターをリストする簡単なクエリを作成します(簡単)

  2. 各映画を(その監督とともに)対応する評価にリンクする「参加」を行います

  3. ステップ2から「参加」し、「group by」ディレクターと「max(rating)」を実行します

于 2012-04-11T06:10:51.840 に答える