Для случаев, когда рецензент оценивал одно и то же 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;