SQL计算集合中出现的平均值

时间:2017-04-20 00:21:45

标签: sql function

我有一个学校项目的数据集,包括他们所属的一组电影和流派。一部电影可以属于不止一种类型,每一种都是表中的一行(id是pk)。例如一小部分样本

1  Taken  Action
2  Sherlock Holmes Mystery
3  Sherlock Holmes Action
4  Predator        Horror
5  Predator        Action
6  Omen            Horror
7  Pink Panther    Comedy

对于给定的类型,我如何找到该类型中的电影的平均类型数是多少。例如平均而言,恐怖类型的电影是1.5流派。

一般来说,我习惯于对工资,数字这样的项目做平均值,但这有点不同

1 个答案:

答案 0 :(得分:0)

请尝试以下方法......

SELECT genreListGenre,
       AVG( movieGenreCount ) AS genreMean
FROM ( SELECT genreList.genre AS genreListGenre,
              genreList.movieID AS genreListMovie,
              COUNT( moreGenres.genre ) AS movieGenreCount
       FROM movies AS genreList
       JOIN movies AS moreGenres ON genreList.movieName = moreGenres.movieName
       GROUP BY genreList.genre,
                genreList.movieID
     ) AS genreListGenerator
GROUP BY genreListGenre
ORDER BY genreListGenre;

内部查询将movies的一个实例连接到同一个表的另一个实例。因此,每个实例的字段仍然可以被引用而不会混淆,每个实例都会被赋予别名genreListmoreGenres。联接的目的是开发一个列表,其中包含每个genre,每个movieIDgenre相关联,每个genremovieID相关联39; s对应movieName。前两个字段可以从movies的一个实例确定,第三个字段可以从第二个实例中提取,并且取决于第一个实例中movieName的值,因此连接位于共享价值movieName

列表成立后,按genreList.genregenreList.movieID进行分组,并为该组制作每个相关类型(moreGenres.genre)的计数。

外部查询获取内部查询返回的字段,并按genre对其进行分组,并为每个genre计算与每个genre相关联的每个movie的计数的平均值1}}与该组genre相关联。

如果您有任何问题或意见,请随时发表评论。

附录

此代码使用以下脚本针对movies创建的实例(在MySQL中)进行了测试...

CREATE TABLE movies
(
    movieID     INT,
    movieName   VARCHAR( 50 ),
    genre       VARCHAR( 20 )
);
INSERT INTO movies ( movieID,
                     movieName,
                     genre )
VALUES ( 1, 'Taken',           'Action'  ),
       ( 2, 'Sherlock Holmes', 'Mystery' ),
       ( 3, 'Sherlock Holmes', 'Action'  ),
       ( 4, 'Predator',        'Horror'  ),
       ( 5, 'Predator',        'Action'  ),
       ( 6, 'Omen',            'Horror'  ),
       ( 7, 'Pink Panther',    'Comedy'  );