【问题标题】:SQL- How to write a query that returnsSQL-如何编写返回的查询
【发布时间】:2018-05-13 04:36:21
【问题描述】:

我有一个数据库,它只是一个包含 3 列的表:viewer_id、movie_id、Ranking (整数) (整数) (文本)

此表中的一行代表某个观众看过某部电影。

我需要编写一个返回的查询: 观看了某个观众已观看的所有电影中至少 75% 的所有观众的 ID(我们称他为 alex)。

我设法返回与给定观众观看相同电影的所有观众的所有 ID:

SELECT otherss.viewer_id FROM  
((SELECT viewer_id,movie_id FROM viewers_movies_rankings 
 WHERE viewer_id= 313) AS alex
INNER JOIN (SELECT viewer_id,movie_id FROM viewers_movies_rankings
 WHERE viewer_id != 313) AS otherz
ON alex.movie_id = otherss.movie_id)

这段代码返回给定观众 (alex) 观看的电影数量:

 SELECT COUNT (*) AS num FROM viewers_movies_rankings WHERE viewer_id = 313

我怎样才能完成这个查询? 我正在努力使用“分组依据”以及如何计算其他观众看过多少类似电影。

谢谢

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    嗯。这很棘手。

    select vmr.viewer_id
    from viewers_movies_rankings vmr cross join
         (select count(*) as cnt
          from viewers_movies_rankings vmr_alex
          where vmr_alex.viewer_id = 313
         ) alex
    where vmr.movie_id in (select vmr_alex.movie_id from viewers_movies_rankings vmr_alex where vmr_alex.viewer_id = 313)
    group by vmr.viewer_id
    having count(*) >= 0.75 * alex.cnt;
    

    您可以将 Alex 从结果中过滤掉,但这是一个很好的测试来检查她/他是否被返回。

    注意:这假设观众/电影巴黎在viewers_movies_rankings 中是唯一的。

    【讨论】:

    • 你能解释一下什么是 vmr 吗?
    • VMR 是 VIEWERS_MOVIES_RANKINGS 表的表别名。您可以使用更短的 alias 来代替在引用其中的列时输入如此长的表名。
    【解决方案2】:

    我想出了一个使用横向连接的解决方案,以获取从子查询中观看的常见电影的计数。亚历克斯看过的电影的数量也在子查询中获取。它们都与(不同的)观众 ID 集交叉连接。

    我假设“Alex”本身不应该包含在结果中,并且一个人可以多次观看一部电影,但这对于百分比的计算没有意义。

        SELECT vmr.viewer_id
               FROM (SELECT DISTINCT vmri.viewer_id
                            FROM viewers_movies_rankings vmri) vmr
                    CROSS JOIN (SELECT count(DISTINCT vmri.movie_id) c
                                       FROM viewers_movies_rankings vmri
                                            WHERE vmri.viewer_id = 313) a 
                    CROSS JOIN LATERAL (SELECT count(DISTINCT vmri1.movie_id) c
                                               FROM viewers_movies_rankings vmri1
                                                    INNER JOIN viewers_movies_rankings vmri2
                                                               ON vmri2.movie_id = vmri1.movie_id
                                                    WHERE vmri1.viewer_id = 313
                                                          AND vmri2.viewer_id = vmr.viewer_id) x
               WHERE x.c::decimal / a.c::decimal >= .75
                     AND vmr.viewer_id <> 313;
    

    this SQL Fiddle查看它的实际应用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2016-11-26
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多