我有一个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
如何完成此查询? 我正在努力使用“分组”以及如何计算其他观众观看过多少部同类电影。
谢谢
答案 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看到它的实际效果。