我有一个学校项目的数据集,包括他们所属的一组电影和流派。一部电影可以属于不止一种类型,每一种都是表中的一行(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流派。
一般来说,我习惯于对工资,数字这样的项目做平均值,但这有点不同
答案 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
的一个实例连接到同一个表的另一个实例。因此,每个实例的字段仍然可以被引用而不会混淆,每个实例都会被赋予别名genreList
和moreGenres
。联接的目的是开发一个列表,其中包含每个genre
,每个movieID
与genre
相关联,每个genre
与movieID
相关联39; s对应movieName
。前两个字段可以从movies
的一个实例确定,第三个字段可以从第二个实例中提取,并且取决于第一个实例中movieName
的值,因此连接位于共享价值movieName
。
列表成立后,按genreList.genre
和genreList.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' );