4

さて、私はここにこのコードを持っています:

SELECT MOVIETITLE AS "Movie Title", MIN(AVG(RATING)) AS "Lowest Average Rating"
FROM MOVIE, RATING
WHERE MOVIE.MOVIEID = RATING.MOVIEID
GROUP BY MOVIETITLE;

評価テーブルから最低の平均評価を微調整する必要があるため、集計関数を使用しました

MIN(AVG(RATING))

私はこのエラーを受け取り続けます、そして私はそれを解決する方法を理解することができません:

ORA-00937: not a single-group group function

私はSQLとOracleを初めて使用するので、これはすべて私にとって非常に新しいことです...

編集

わかりやすくするために、評価テーブルに同じ映画を評価している人が複数います。基本的に、各映画のすべての評価の平均を取得し、平均が最も低い映画をリストする必要があります。

4

6 に答える 6

3

そしてもう1つのSQLフィドル

select min(rating)
from (select m.movietitle, avg(r.rating) as rating
      from movie m, rating r
      where m.movieid = r.movieid
      group by m.movietitle) t;
于 2012-11-19T08:31:48.367 に答える
2

それはできません。サブクエリに追加してみてください

SELECT MOVIETITLE AS "Movie Title", AVG(RATING) AS "AVGRating"
FROM MOVIE, RATING
WHERE MOVIE.MOVIEID = RATING.MOVIEID
GROUP BY MOVIETITLE
HAVING AVG(RATING) =
(
    SELECT MIN(AVG(RATING)) AS "AVGRating"
    FROM MOVIE, RATING
    WHERE MOVIE.MOVIEID = RATING.MOVIEID
    GROUP BY MOVIETITLE
)
于 2012-11-19T08:25:49.377 に答える
2

別のアプローチ (最低評価が同じ映画が複数ある場合は、すべて表示されます):

-- sample of data just for the sake of demonstration
SQL> with movie as(
  2     select 1  as movieid , 'Departed' as movietitle from dual union all
  3     select 2, 'Shutter Island' from dual union all
  4     select 3, 'Terminator'     from dual
  5  ),
  6  rating as(
  7    select 1  as movieid, 7 as rating from dual union all
  8    select 1, 8 from dual union all
  9    select 1, 9 from dual union all
 10    select 1, 6 from dual union all
 11    select 1, 7 from dual union all
 12    select 2, 9 from dual union all
 13    select 2, 5 from dual union all
 14    select 2, 6 from dual union all
 15    select 3, 6 from dual union all
 16    select 3, 5 from dual union all
 17    select 3, 6 from dual
 18  ) -- the query
 19   select w.movietitle     as "Movie Title"
 20        , round(w.mavr, 1) as "Lowest Average Rating"
 21     from ( select movietitle
 22                 , min(avg(rating)) over() as mavr
 23                 , avg(rating) as avr
 24              from movie
 25                 , rating
 26             where movie.movieid = rating.movieid
 27             group by movietitle
 28          ) w
 29    where w.mavr = w.avr
 30  ;

結果:

Movie Title    Lowest Average Rating
-------------- ---------------------
Terminator                       5,7
于 2012-11-19T09:07:28.953 に答える
2

集計に追加の値を含める標準的な方法があればいいのですが。多くの値を単一の RAW 値に結合し、その集計を取得してから、集計から元の値を抽出していることに気付きました。

/* lowest returns a single row */
with lowest as (
  select min(
  /* combine movieid and avg(rating) into a single raw
   * binary value with avg(rating) first so that min(..)
   * will sort by rating then by movieid */
  utl_raw.overlay(
  utl_raw.cast_from_binary_integer(movieid),
  utl_raw.cast_from_number(avg(rating)), 5)) packed
  from rating group by movieid)

/* extract our rating and movieid from the packed aggregation
 * and use it to lookup our movietitle */
select movietitle,
  utl_raw.cast_to_number(utl_raw.substr(packed,1,3)) rating
from movie m, lowest l
where m.movieid=
  utl_raw.cast_to_binary_integer(utl_raw.substr(packed,5,4))

注: これは、movieid が int で、rating が数値であることを前提としています (SQL Fiddle DDL を参照してください)。両方とも int または数値の場合は、より重要な値を左にシフトし (2 のべき乗で乗算)、それらを加算することによってそれらを「パック」することもできます。

SQL フィドル

于 2012-11-19T09:10:05.913 に答える
0

平均評価を計算し、昇順で並べて、最初の結果を取得します。

 SELECT *
 FROM   (
        SELECT   MOVIETITLE AS "Movie Title",
                 AVG(RATING) AS "Lowest Average Rating"
        FROM     MOVIE, RATING
        WHERE    MOVIE.MOVIEID = RATING.MOVIEID
        GROUP BY MOVIETITLE
        ORDER BY 2 ASC)
 WHERE ROWNUM = 1;
于 2012-11-19T11:00:51.840 に答える
0

映画のタイトルも必要な場合は、分析関数を使用して最小値を取得します。これにより、各テーブルを 1 回だけヒットできます (ここで、今草 顿 웃 によって与えられたソリューションは、各テーブルを 2 回ヒットします.. メイン選択で 1 回、「有」選択で 1 回)。

select movietitle as "Movie Title", avgrating as "Lowest Average Rating"
from (
    select
        m.movietitle,
        avg(r.rating) avgrating,
        rank() over (order by avg(rating)) rank
    from
        movie m
        inner join rating r
            on r.movieid = m.movieid
    group by
        m.movietitle
)
where rank = 1;
于 2013-11-14T18:52:54.860 に答える