Проблемы с присоединением SQL к заданию - PullRequest
0 голосов
/ 02 августа 2020

У меня есть вопрос к моему заданию

Данные

Вопрос: Для всех случаев, когда один и тот же рецензент дважды оценил одно и то же mov ie и дал это более высокий рейтинг во второй раз, вернуть имя рецензента и заголовок mov ie.

Вот что я пробовал. Я соединил все таблицы.

select *
from Rating 
join Reviewer on Rating.rID = Reviewer.rID
join Movie on Rating.mID = Movie.mID

Но как продолжить? Если рецензент оценил тот же Mov ie, а последний рейтинг этого mov ie выше предыдущего, то мне нужно показать этого рецензента. Но как это сделать в SQL?

Ответы [ 3 ]

1 голос
/ 02 августа 2020

Снова соедините то, что у вас уже было с Rating, чтобы вы могли получить все записи, в которых рецензент тот же, а mov ie тот же, а затем отфильтруйте только строки, где запись с более поздним ratingDate имеет больше звезд.

Если один и тот же рецензент проверял 3 или более раз, используйте select distinct, чтобы удалить дубликаты

select distinct rev.name, m.title
from Rating r1
join Reviewer rev on rev.rID = r1.rID
join Movie m on m.mID = r1.mID 
join Rating r2 on r1.rID = r2.rID and r1.mID = r2.mID
where r1.ratingDate < r2.ratingDate and r1.stars < r2.stars
0 голосов
/ 02 августа 2020

Для случаев, когда рецензент оценивал одно и то же mov ie несколько раз, вас интересуют их первая и вторая оценка. (Возможные дополнительные оценки, например, рецензент, оценивающий mov ie в третий или четвертый раз et c., Должны игнорироваться.) Итак, пронумеруйте строки (с помощью ROW_NUMBER). Затем посмотрите, выше ли второй рейтинг первого (сгруппировав по рецензенту и mov ie и сравнив оба рейтинга). Для совпадений найдите имя рецензента и заголовок mov ie, для которого вы обычно используете where (rid, mid) in ( subquery ), но SQL Сервер не поддерживает предложения IN с кортежами, поэтому вместо этого вы будете внутренним соединением.

select r.name, m.title
from reviewer r
cross join movie m
join
(
  select rid, mid
  from
  (
    select *, row_number() over(partition by rid order by ratingdate) as rn
    from Rating 
  ) numbered
  group by rid, mid
  having max(rn) > 1
  and any_value(case when rn = 1 then stars end) <
      any_value(case when rn = 2 then stars end)
) matches on matches.rid = r.rid and matches.mid = m.mid
order by r.name, m.title;
0 голосов
/ 02 августа 2020

Вот способ сделать это ..

Я обнаружил количество комбинаций (rid, mid), которые имеют ровно 2 (ie два отзыва от одного и того же рецензента против одного и того же mov ie ) это отображается как столбец cnt. После этого я нахожу последний рейтинг, ранжируя дату рейтинга в des c. Таким образом, row_number = 1 дает вам последнее значение рейтинга

with data
  as (
select count(*) over(partition by rt.rid,rt.mid) as cnt
       ,row_number() over(partition by rt.rid,rt.mid order by rt.ratindate desc) as rnk
       ,rw.name
       ,mov.title
  from rating rt
  join reviewer rw
    on rt.rid=rw.rid
  join movie mov 
    on mov.mid=rt.mid
      )
select *
  from data
 where rnk=1
   and cnt=2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...