Sql server SQL Server 2012类型中每部电影的平均类型

Sql server SQL Server 2012类型中每部电影的平均类型,sql-server,sql-server-2012,Sql Server,Sql Server 2012,偶然发现这个问题,我也找不到解决方案,需要一些帮助或给我指出正确的方向 这些表格将几部电影分为多种类型,例如:《玩具总动员》属于多种类型;儿童、喜剧和动画 我试图找出哪种类型的电影最为清晰,哪种类型的电影如此混乱,以至于在一部典型的电影中,它们往往被列在其他几种类型的电影中 对于数据集中的每种类型,该类型的电影平均有多少种类型。例如,一部动作片有1.3种类型,而一般的冒险片有2.9种类型,因此动作片是一种更好定义的类型 下面是表的示例,但这里有一个sql编辑器,其中包含表和值供参考: 3个表:

偶然发现这个问题,我也找不到解决方案,需要一些帮助或给我指出正确的方向

这些表格将几部电影分为多种类型,例如:《玩具总动员》属于多种类型;儿童、喜剧和动画

我试图找出哪种类型的电影最为清晰,哪种类型的电影如此混乱,以至于在一部典型的电影中,它们往往被列在其他几种类型的电影中

对于数据集中的每种类型,该类型的电影平均有多少种类型。例如,一部动作片有1.3种类型,而一般的冒险片有2.9种类型,因此动作片是一种更好定义的类型

下面是表的示例,但这里有一个sql编辑器,其中包含表和值供参考:

3个表:

类型表:

id  name
1   Action
2   Adventure
3   Animation
4   Children's
5   Comedy
电影类型表:

id movie_id     genre_id
1  1(Toy Story) 3(Animation)
2  1(Toy Story) 4(Children's)
3  1(Toy Story) 5(Comedy)
4  2(GoldenEye) 1(Action)
5  2(GoldenEye) 2(Adventure)
6  2(GoldenEye) 16(Thriller)
id title             release_date
1  Toy Story (1995)  1995-01-01
2  GoldenEye (1995)  1995-01-01
3  Four Rooms (1995) 1995-01-01
电影表:

id movie_id     genre_id
1  1(Toy Story) 3(Animation)
2  1(Toy Story) 4(Children's)
3  1(Toy Story) 5(Comedy)
4  2(GoldenEye) 1(Action)
5  2(GoldenEye) 2(Adventure)
6  2(GoldenEye) 16(Thriller)
id title             release_date
1  Toy Story (1995)  1995-01-01
2  GoldenEye (1995)  1995-01-01
3  Four Rooms (1995) 1995-01-01
到目前为止,我所做的最大努力是尝试对流派id的计数进行平均。请参见以下内容:

SELECT 
    name, AVG(c.count)
FROM 
    (SELECT
         g.name AS name, COUNT(gm.genre_id) AS count
     FROM
         genres g 
     INNER JOIN
         genres_movies gm ON g.id = gm.genre_id
     INNER JOIN
         movies m ON m.id = gm.movie_id
     GROUP BY
         g.name) c
GROUP BY
    name

但这只是给了我一个
genres\u movies
表中每种类型的计数。我似乎不知道如何将其转化为每种类型电影的平均类型数

我首先用我想要的主要信息构建最内部的查询,然后向外工作,以此来解决类似的问题

所需的核心信息是:

select movie_id, count(*) from genres_movies group by movie_id
完整查询:

select G.name, Round(avg(numgenres),2) as MuddleFactor
from genres_movies GM

inner join
(select movie_id, count(*) as numGenres
 from genres_movies
 group by movie_id) MNG 
 on MNG.movie_id = GM.movie_id

inner join genres G
on GM.genre_id = G.id

group by G.name
order by MuddleFactor desc

你需要在桌子上做一个笛卡尔积(self-join),这样你就可以为每部电影展示两种类型的每一种组合。然后,聚合/统计更为明显

嗯。这是密码

Select Genres.Name As Genre,
        Count(*)*1.0/Count(Distinct A.Movie_Id) As Average_Genres
    From Genres_Movies A
            Inner Join
        Genres_Movies B
                On A.Movie_Id=B.Movie_Id
            Inner Join
        Genres
                On A.Genre_Id=Genres.Id
    Group By Genres.Name
    Order By 2 Desc

你能在问题中添加更多的例子和预期结果吗?看不到恐怖电影的任何记录。在本例中,请参阅流派表中的@DarshanMehta恐怖id=11。我用行动代替了恐惧,以澄清一点。这个问题对我来说也很难理解,所以如果你需要更清楚的话,请告诉我。我在表格中添加了我到目前为止所做的工作,以及更多的例子。是的,但这样我就违反了我在参加InstaCart测试时与InstaCart达成的协议。我给出了足够的提示,能够很好地抽象数据问题的人应该能够很容易地解决。但再给一个提示,这个问题可以通过一个连接和一个分组来解决。谁是instacart?为什么编写SQL查询会违反任何协议?听起来是一个非常糟糕的借口我再次查看了他们的另一个测试,它说:“我不会从任何来源(包括网站、书籍或朋友/同事)查阅/复制代码来完成这些测试,尽管可能会参考语言文档或使用具有代码完成功能的IDE。”因此,它不会要求我不发布解决方案。鉴于InstaCart的数据科学家从他们的技术博客上判断的水平非常高,如果申请者需要我的提示来回答这个SQL问题,他们无论如何也不会深入这个过程。所以我会把密码贴到他的问题上。