#sql #sql-server
#sql #sql-сервер
Вопрос:
Мой запрос:
SELECT P.lastname, P.firstname, MAX(MD.movie_id)
FROM Person AS P
INNER JOIN Movie_Directors AS MD ON P.person_id = MD.person_id
INNER JOIN Movie AS M ON M.movie_id = MD.movie_id
GROUP BY P.firstname, P.lastname, MD.movie_id
HAVING MAX(MD.movie_id);
Я получаю эту ошибку:
Выражение неблевого типа, указанное в контексте, где ожидается условие, рядом с ‘;’
Мне нужно получить SQL select для следующего вопроса, я не понимаю ошибку, кто-нибудь может помочь?
В запросе необходимо отобразить режиссера, который на данный момент выпустил больше всего фильмов [имя, фамилия].
Комментарии:
1. 1.
HAVING
Предложение требует сравнения, 2.MAX
вернет фильм с наибольшим идентификатором, который есть у каждого режиссера, а не тот, у которого больше всего фильмов; вам нужно использоватьCOUNT
3. Режиссеры не производят фильмы; они их режиссируют… но я думаю, что это просто придирки2. Это исправило мою ошибку в мозге, спасибо, теперь это работает:
Ответ №1:
Вам нужно указать логическое условие в предложении HAVING, например, НАЛИЧИЕ MAX (MD.movie_id) > 100
Комментарии:
1. Мне нужно найти режиссера, который выпустил больше всего фильмов, поэтому мне нужно получить 1 строку с самым высоким сгруппированным movie_id, вы знаете, что мне нужно изменить тогда?
2. Одним из способов было бы что-то вроде: ВЫБЕРИТЕ TOP 1 P.lastname, P.firstname, COUNT (MD.movie_id) как MovieCount ОТ Person КАК P внутреннее объединение movie_directories КАК MD На P.person_id=MD.person_id внутреннее объединение Movie КАК M На M.movie_id=MD.movie_id ГРУППА movie_id ПО P.firstname, P.lastname ПОРЯДОК MovieCount
Ответ №2:
Предложение ROW_NUMBER может вам помочь. Надеюсь, у меня нет никаких опечаток в этом. Кроме того, если у вас есть person_id, я рекомендую вам использовать это вместо имени, lastname для раздела.
WITH MaxMovies AS
(
SELECT P.lastname, P.firstname, ROW_NUMBER OVER (PARTITION BY firstname, lastname ORDER BY movie_id DESC) MOVIE_NUMBER
FROM Person AS P
inner join Movie_Directors AS MD ON P.person_id=MD.person_id
inner join Movie AS M ON M.movie_id=MD.movie_id
GROUP BY P.firstname, P.lastname
)
SELECT * FROM MAXMOVIES WHERE MOVIE_NUMBER=1
Ссылка: https://learn.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql?view=sql-server-2017