在游戏节目数据库场景中,如何在单个查询中获取每个季节的平均总集数?

时间:2017-10-12 03:16:11

标签: sql postgresql

原谅标题血腥。我很难找到一个表达问题的好方法,这个问题是特有的。

季节

  id   name  
 ---- ------ 
   1   Season 1
   2   Season 2
   3   Season 3

插曲

  id   season_id   number                   title                  
 ---- ----------- -------- --------------------------------------- 
   1           1        1   Pilot                                  
   2           1        2   1x02 - We Got Picked Up                
   3           1        3   1x03 - This is the Third Episode       
   4           2        1   2x01 - We didn't get cancelled.        
   5           2        2   2x02 - We're running out of ideas!     
   6           3        1   3x01 - We're still here.               
   7           3        2   3x02 - Okay, this game show is dying.  
   8           3        3   3x03 - Untitled 

评分

  id   episode_id   score   contestant_id (table not given)  
 ---- ------------ ------- --------------------------------- 
   1            1      35                                 1  
   2            1     -12                                 2  
   3            1       8                                 3  
   4            1       5                                 4  
   5            2      13                                 1  
   6            2      -2                                 5  
   7            2       3                                 3  
   8            2     -14                                 6  
   9            3   -14.5                                 1  
  10            3      -3                                 2  
  11            3     1.5                                 7  
  12            3     9.5                                 5  
  13            4    22.8                                 1  
  14            4      -3                                 8  
  15            5       2                                 1  
  16            5    13.5                                 9  
  17            5       7                                 3  
  18            6      13                                 1  
  19            6     -84                                10  
  20            6      12                                11  
  21            7       3                                 1  
  22            7      10                                 2  
  23            8      29                                 1  
  24            8       1                                 5

如您所见,每季有多集,每集多个分数(每位参赛者一个分数)。参赛者可以在以后的剧集中重新出现(不相关),分数是浮点值,每集可以有任意数量的分数。

那我在找什么?

我想获得每个季节的平均总发作得分,其中总发作得分是一集中所有得分的总和。在数学上,这是一个季节中所有乐谱的总和除以剧集的数量。很容易理解,但我在一次查询中遇到麻烦并获得正确的结果。我喜欢以下输出:

    name     average_total_episode_score  
 ---------- ----------------------------- 
  Season 1                          9.83  
  Season 2                         21.15  
  Season 3                         -5.33

顶级查询需要位于 season 表中,因为它将与同一个表上的其他类似查询结合使用。使用子查询中的聚合来执行此操作非常容易,但聚合会执行子查询,从而无法满足我的单一查询要求。这可以在一个查询中完成吗?

3 个答案:

答案 0 :(得分:0)

希望这应该有用

Select s.id, avg(score)
  FROM Season S,
       Episode e,
       Score sc
 WHERE s.id = e.season_id
   AND e.id = sc.episode_id
Group by s.id

答案 1 :(得分:0)

好的,只是搞清楚了。像往常一样,在简单的解决方案落到我身上之前,我不得不写一本完整的书。

我的查询中的问题(我没有在问题中给出)是缺少DISTINCT计数。这是一个有效的查询:

SELECT
  "season"."id",
  "season"."name",
  (SUM("score"."score") / COUNT(DISTINCT "episode"."id")) AS "average_total_episode_score"
FROM "season"
LEFT OUTER JOIN "episode"
  ON ("season"."id" = "episode"."season_id")
LEFT OUTER JOIN "score"
  ON ("episode"."id" = "score"."episode_id")
GROUP BY "season"."id"

答案 2 :(得分:-1)

选择Se.id AS Season_Id,sum(得分)作为season_score,来自得分S的avg(得分)加入情节E ON S.episode_id = E.id 通过se.id

加入季节se on se.id = e.season_id group