SQL-如何编写返回的查询

时间:2018-05-12 19:28:55

标签: sql postgresql

我有一个DB,它只是一个包含3列的表:viewer_id,movie_id,Ranking                                                     (整数)(整数)(文字)

此表中的某行表示某个观看者观看了某部电影。

我需要编写一个返回的查询: 所有观众至少观看过75%的观众观看过的观众(让我们称他为亚历克斯)。

我设法返回所有观看与给定观看者相同电影的观众的所有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)

此代码返回给定观看者(亚历克斯)观看的电影数量:

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

如何完成此查询? 我正在努力使用“分组”以及如何计算其他观众观看过多少部同类电影。

谢谢

1 个答案:

答案 0 :(得分:0)

我想出了一个使用横向连接的解决方案,以获得从子查询中观看的常见电影的数量。亚历克斯观看的电影的数量也在子查询中获取。它们都与(不同的)一组查看器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看到它的实际效果。