I need to get each filmmaker’s name, their highest-rated movie title, and that rating. Movies without a filmmaker should be ignored.
I started with this:
SELECT name, filmmaker
FROM FilmDB NATURAL JOIN Review
WHERE filmmaker IS NOT NULL
But I’m stuck on how to get the highest rating for each filmmaker. Any tips on how to finish this query? I’m pretty new to SQL, so simple explanations would be great. Thanks!
Hey there! have u considered using a subquery? something like:
SELECT f.filmmaker, f.name, r.avg_score
FROM FilmDB f
JOIN (
SELECT filmID, AVG(score) as avg_score
FROM Review
GROUP BY filmID
) r ON f.filmID = r.filmID
WHERE f.filmmaker IS NOT NULL
AND (f.filmmaker, r.avg_score) IN (
SELECT filmmaker, MAX(avg_score)
FROM FilmDB f2
JOIN (SELECT filmID, AVG(score) as avg_score FROM Review GROUP BY filmID) r2 ON f2.filmID = r2.filmID
GROUP BY filmmaker
)
Here’s a solution that should work for your SQL challenge:
WITH RankedFilms AS (
SELECT
f.filmmaker,
f.name AS film_title,
AVG(r.score) AS avg_rating,
RANK() OVER (PARTITION BY f.filmmaker ORDER BY AVG(r.score) DESC) AS rank
FROM
FilmDB f
JOIN
Review r ON f.filmID = r.filmID
WHERE
f.filmmaker IS NOT NULL
GROUP BY
f.filmmaker, f.name
)
SELECT
filmmaker,
film_title,
avg_rating
FROM
RankedFilms
WHERE
rank = 1;
This query uses a Common Table Expression (CTE) with a window function to rank each filmmaker’s movies by average rating. It then selects only the top-ranked film for each filmmaker. This approach handles ties effectively and provides the exact information you’re looking for. Let me know if you need any clarification on how this works!
SELECT f.filmmaker, f.name, MAX(r.score) as top_rating
FROM FilmDB f
JOIN Review r ON f.filmID = r.filmID
WHERE f.filmmaker IS NOT NULL
GROUP BY f.filmmaker;