【问题标题】:How to compare column against itself?如何将列与自身进行比较?
【发布时间】:2023-03-15 04:57:02
【问题描述】:

您很快就会了解到,我对 SQL 很陌生。所以,我有许多表,一个是具有相应标题和电影 ID 的电影列表,另一个是评级列表 (0-5),其中包含任何用户提交的每个评级以及他们附加的电影 ID。我想将每部电影的平均评分与其他电影的平均评分进行比较,并生成一个包含结果的表格。到目前为止,我有:

    SELECT movies.movieid as movieid1, movies.movieid as movieid2, 1 - ((ABS(AVG(ratings.rating) - AVG(ratings.rating)))/5) as average
    FROM movies
    JOIN ratings
        ON movies.movieid = ratings.movieid
    GROUP BY movies.movieid;

但是,这只是将每部电影与其自身进行比较,因此对所有电影的平均评分比较为 1.000。如何将每个 movieid 与每个其他唯一的 movieid 进行比较,而不是将它们与自己进行比较? 供参考,

谢谢!

【问题讨论】:

  • / 5 的作用是什么?
  • 请在您的问题中添加几行示例数据和预期结果。

标签: sql postgresql self-join


【解决方案1】:

要获得整个表格的平均值,请使用窗口函数。

例如,下面给出所有电影平均评分的平均值...

AVG(AVG(ratings.rating)) OVER ()

【讨论】:

    【解决方案2】:

    你可以得到一个组的平均评分

    select movie_id, avg(rating) as rating from ratings group by movie_id
    
    

    您可以使用交叉连接来获取电影的所有组合

    select a.movie_id, b.movie_id from 
    movies as a cross join movies as b 
    

    使用 with 语句将其放在一起

    with avg_rating as ( 
      select movie_id, avg(rating) as rating from ratings group by movie_id
    )
    
    select a.movie_id, b.movie_id, a.rating / b.rating 
    from avg_rating as a cross join avg_rating as b 
    where a.movie_id <> b.movie_id
    

    【讨论】:

      【解决方案3】:

      如果要将电影与其他电影进行比较,则需要自加入操作。这将为您提供所有评分对。

      SELECT r1.rating first_rating
             r1.movieid first_movieid,
             r2.rating second_rating,
             r2.movieid second_movieid
        FROM ratings r1 
        JOIN ratings r2 ON r2.movieid < r1.movieid 
      

      魔法就在 ON 子句中。不等式阻止结果与自己比较电影,&lt; 确保比较不会重复 Forrest Gump::Avatar 和 Avatar::Forrest Gump。

      如果您有很多行,这会很慢。 O(n 平方)。

      【讨论】:

        【解决方案4】:

        我想将每部电影的平均评分与其他所有电影的平均评分进行比较,并生成一个包含结果的表格。

        如果你想比较两部电影的平均收视率,那么你需要这样的东西:

        with r as (
              select movieid, avg(rating) as avg_rating
              from ratings r
              group by movieid
             )
        select r1.movieid, r2.movieid, r1.avg_rating, r2.avg_rating
        from r r1 join
             r r2
             on r1.movieid < r2.movieid;
        

        然后您可以对评分执行任何您想要的算术运算。

        【讨论】:

          猜你喜欢
          • 2013-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-25
          相关资源
          最近更新 更多