2

私のテーブルは次のとおりです。

CREATE TABLE Rating
(
    rid INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    mid INTEGER FOREIGN KEY REFERENCES Movie(movieId) ON DELETE CASCADE, 
    uid INTEGER FOREIGN KEY REFERENCES User(id) ON DELETE CASCADE,
    rating INTEGER NOT NULL, 
);

平均評価が最も高い mid を選択したい:

select avg(r.rating) from rating r

魔女は平均を返します。最も平均的な評価の mid`s を返したいです。それを行う方法はありますか?

> 更新

他の 2 つのテーブル:

CREATE TABLE User(
    id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    passwordhash VARCHAR(100) NOT NULL,
    fullname VARCHAR(50) NOT NULL,
    birthday DATE NOT NULL,
    joindate DATE NOT NULL,
    email VARCHAR(50) NOT NULL,
    picturepath VARCHAR(256) NOT NULL,
    favouritemovie VARCHAR(50) NOT NULL,
    favouritecategory INTEGER REFERENCES category(id),
    isDeleted BOOLEAN NOT NULL
);

CREATE TABLE Movie
(
    movieId INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    moviePath VARCHAR(500) NOT NULL
);
4

3 に答える 3

1

あなたのコメントから:

各 mid の平均評価を計算し (GROUP BY mid を使用)、最大値を選択して mid を返す

したがって、最初のステップでは、各ミッドの平均を計算します。

select mid, 
       avg(rating) as avg_rating
from rating
group by mid;

次に最大値を選択します。

select max(avg_rating)
from (
  select avg(rating) as avg_rating
  from rating
  group by mid
) as mar

これらを組み合わせます:

select ar.mid, mar.max_avg
from (
    select mid, 
           avg(rating) as avg_rating
    from rating
    group by mid
  ) as ar
  join (
    select max(avg_rating) as max_avg
    from (
      select avg(rating) as avg_rating
      from rating
      group by mid
    ) as t
  ) as mar
  on ar.avg_rating = mar.max_avg;

SQLFiddle の例 (Postgres を使用しますが、HSQLDB でも動作します): http://sqlfiddle.com/#!12/e208a/8

これは最も単純な解決策ではありませんが、グループ化されたデータに対するクエリは決して簡単ではありません。TOPLuther が示すように構成を使用すると、はるかに高速になります。の唯一の欠点は、TOP 12 つの映画の平均評価が同じかどうかに気付かないことです。

編集:HSQLDBを少し超えて拡張するだけです。ウィンドウ関数 (PostgreSQL、Oracle など) をサポートするデータベースでは、この種の質問は非常に簡単です。

select *
from (
  select mid, 
         avg(rating) as avg_rating,
         dense_rank() over (order by avg(rating) desc) as rnk
  from rating
  group by mid
) t
where rnk = 1;

2 番目に高いもの、3 番目に高いもの ( where rnk = 2, where rnk = 3) を見つけるのは特に簡単ですが、これらのネストされたクエリを使用すると非常に複雑になりますが、アプローチを使用すると少し簡単になりTOP/LIMITます。

于 2013-01-12T09:29:25.460 に答える
0

おそらく次のようなものです:

SELECT TOP 10
  mid,
  avg(cast(r.rating as float))
FROM Rating r
GROUP BY mid
ORDER BY avg(cast(r.rating as float)) DESC

評価を float に変更する必要はありませんが、評価が 4 anf 5 の場合は、int に丸めるのではなく、平均を 4.5 にした方がよいと考えました。

于 2013-01-12T09:12:27.010 に答える
0

あなたは、ほとんどの平均評価からミッドを選択したいと言いました..これを試してください..

select max(x.avgr)
from (
  select r.mid, avg(r.rating) avgr
  from rating r
  group by r.mid
) as x;

またはこれを試してください: Sql Serverで動作します。

select Top 1 r.mid, avg(r.rating) as avgr
from rating r
group by r.mid
order by avgr desc
;

Top動作しないdbm は、limit 1代わりに使用できます。

    select r.mid, avg(r.rating) as avgr
    from rating r
    group by r.mid
    order by avgr desc Limit 1
    ;
于 2013-01-12T09:29:54.267 に答える