выберите самое высокое значение во второй раз в SQL - PullRequest
0 голосов
/ 17 мая 2018

Я выполняю упражнение SQL: во всех случаях, когда один и тот же рецензент дважды оценивал один и тот же фильм и во второй раз оценивал его, возвращает имя рецензента и название фильма.

Мое решение здесь, и оно работает, но я думаю, что это должен быть более разумный способ получить это решение. После нескольких проверок я вставил условие «LIMIT 1 OFFSET 1» в конце кода, потому что с первого взгляда увидел, что мне нужен именно этот результат. Моя проблема в том, что я думаю, что мой подход не автоматизирует мой запрос. Любое предложение улучшить мой код?

 SELECT name, title
 FROM Rating
 JOIN Reviewer 
 ON Reviewer.rID = Rating.rID
 JOIN Movie 
 ON Movie.mID = Rating.mID
 GROUP BY name
 ORDER BY ratingDate DESC 
 LIMIT 1 OFFSET 1;

МОЙ новый запрос:

SELECT
    name, title
FROM
     Rating
JOIN Reviewer ON Reviewer.rID = Rating.rID
JOIN Movie    ON Movie.mID = Rating.mID
     WHERE
         NOT EXISTS (SELECT *
            FROM Rating   later_higher
           WHERE later_higher.rid = Rating.rid
             AND later_higher.mid  = Rating.mid
             AND later_higher.stars > Rating.stars
             AND later_higher.ratingDate > Rating.ratingDate
         )
         AND EXISTS (SELECT *
            FROM Rating   earlier_lower
           WHERE earlier_lower.rid = Rating.rid
             AND earlier_lower.mid = Rating.mid
             AND earlier_lower.stars < Rating.stars
             AND earlier_lower.ratingDate < Rating.ratingDate
        )

Ответы [ 2 ]

0 голосов
/ 17 мая 2018
SELECT name, title FROM(SELECT name, title, ROW_NUMBER() OVER(PARTITION BY 
 re.reviewer_id, re.film_id ORDER BY re.score DESC) seq
 FROM Rating ra
 LEFT JOIN Reviewer re ON ra.rID = re.rID
 LEFT JOIN Movie m ON ra.mID = m.mID
) a WHERE a.seq = 1;

Это разделяет обзоры, основанные на рецензенте и фильме, затем сортирует оценку, основанную на самом высоком.Таким образом, рецензент мог просмотреть несколько фильмов, но вам нужно наивысшее количество баллов за фильм, он / она рецензировал.

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

Возвращает отзыв, если ...

  • Ранее был обзор с более низким баллом
  • Не было более поздней рецензии с более высокой оценкой (которая позже вернулась бы)

http://sqlfiddle.com/#!9/8fbff4/1

SELECT
  *
FROM
  reviews
WHERE
  NOT EXISTS (SELECT *
                FROM reviews   later_higher
               WHERE later_higher.reviewer_id = reviews.reviewer_id
                 AND later_higher.film_id     = reviews.film_id
                 AND later_higher.score       > reviews.score
                 AND later_higher.review_date > reviews.review_date
             )
  AND EXISTS (SELECT *
                FROM reviews   earlier_lower
               WHERE earlier_lower.reviewer_id = reviews.reviewer_id
                 AND earlier_lower.film_id     = reviews.film_id
                 AND earlier_lower.score       < reviews.score
                 AND earlier_lower.review_date < reviews.review_date
             )

Затем вы можете присоединиться к любым другим таблицам, которые вам нравятся, чтобы получить названия фильмов, имена рецензентов и т. Д.

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