查询按平均成绩和名称提取最高记录

时间:2017-11-13 21:14:11

标签: sql oracle oracle-sqldeveloper

我有两张桌子:MoviesReviews

Movies包含以下列:ID,标题,流派,持续时间;

Reviews包含ID,说明,Movie_ID(引用电影中的ID)和成绩。

我想以平均值显示电影的顶部。 (我想显示电影的标题及其平均成绩。)

我尝试了2个子查询:一个用于选择标题,另一个用于从评论中获取AVG(与电影一起加入),但我无法弄清楚如何将SELECT AVG(GRADE)...的结果提供给{{ 1}}。 我正在尝试正确的方式吗?

SELECT TITLE FROM MOVIES ...

预期结果:

Movies

ID        TITLE          GENRE       DURATION
1         Movie_name_1   Sci-fi      120
2         Movie_name_2   Comedy      100
3         Movie_name_3   Drama       140
4         Movie_name_4   Sci-fi      105

Reviews
ID        Description    Movie_id      Grade 
1         WOW             1             10
2         SUCH            2             9
3         Great           3             9
4         Amazing         2             10
5         Decent          4             7
6         Legendary       2             10
7         Waste           3             4
8         hmmm            1             6

1 个答案:

答案 0 :(得分:2)

这应该可行,只需将FETCH数字更改为您想要查看的行数

SELECT Title, AVG(Grade) Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title
ORDER BY Grade DESC
FETCH FIRST 5 ROWS ONLY;

编辑:下面有更详细的说明

此查询的基础是:

SELECT Title, Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID

这将为您提供单个结果集中所需的所有信息。

接下来,您希望每部电影的平均Grade Title

这是通过使用平均功能AVG()和按Title进行分组来完成的(因为你想要毕竟每个标题的平均成绩):

SELECT Title, AVG(Grade) Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title

注意:Grade中的第二个AVG(Grade) Grade只是一个别名。 AVG(Grade)没有列名,所以为简单起见,我们调用新的平均列Grade

您也可以将其写为AVG(Grade) as Grade,这可能会让您更清楚。

接下来,您想先看一下最受欢迎的电影。我们使用ORDER BY执行此操作。我们可以在此处引用我们的平均Grade列:

SELECT Title, AVG(Grade) Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title
ORDER BY Grade DESC --Referencing the averaged column, not the main column

最后但同样重要的是,您提到要查看顶部的 n 行。我们可以使用FETCH FIRST n ROWS ONLY子句来执行此操作:

SELECT Title, AVG(Grade) Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title
ORDER BY Grade DESC
FETCH FIRST 5 ROWS ONLY;

这里是最后一个版本,带有不同的别名,以便更清晰:

SELECT Title, AVG(Grade) Averaged_Grade
FROM Movies M
JOIN Reviews R on R.Movie_ID = M.ID
GROUP BY Title
ORDER BY Averaged_Grade DESC
FETCH FIRST 5 ROWS ONLY;