Наличие SQL и max

#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