SQL-Как написать запрос, который возвращает - PullRequest
0 голосов
/ 12 мая 2018

У меня есть БД, которая представляет собой просто таблицу с 3 столбцами: viewer_id, movie_id, Ranking (INTEGER) (INTEGER) (TEXT)

Где строка в этой таблице представляет, что определенный зритель смотрелопределенный фильм.

Мне нужно написать запрос, который возвращает: Идентификаторы всех зрителей, которые смотрели не менее 75% всех фильмов, которые смотрел определенный зритель (назовем его Алекс).

Мне удалось что-то, что возвращает все идентификаторы всех зрителей, которые смотрели те же фильмы, что и данный зритель:

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

Как я могу выполнить этот запрос?Я изо всех сил пытаюсь использовать «Группировать по» и как подсчитать, сколько одинаковых фильмов смотрели другие зрители.

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Я придумал решение, использующее боковое соединение, чтобы подсчитать количество обычных фильмов, просмотренных из подзапроса.Количество фильмов, которые посмотрел Алекс, также получено в подзапросе.Они оба перекрестно соединены с (отличным) набором идентификаторов зрителей.

Я предположил, что слова «Алекс» не должны быть включены в результат, и что человек может смотреть фильм несколько раз, но это бессмысленно для расчетав процентах.

    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;

См. это в действии на этой скрипте SQL .

0 голосов
/ 12 мая 2018

Хммм. Это сложно.

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;

Вы можете отфильтровать Алекса по результатам, но это хороший тест, чтобы проверить, возвращен ли он / она.

Примечание. Предполагается, что программа просмотра / просмотра фильмов уникальна в viewers_movies_rankings.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...