I try to get the top 3 length per film for each actor. My query looks my this.
SELECT fullname,
ROW_NUMBER() OVER (PARTITION BY fullname ORDER BY length DESC) as f_rank,
length
FROM
(SELECT actor.first_name || ' ' || actor.last_name as fullname, film.length
FROM film_actor
JOIN film
ON film_actor.film_id = film.film_id
JOIN actor
ON film_actor.actor_id = actor.actor_id) sub
WHERE f_rank <= 3
So it looks like without the where clause
fullname f_rank length Adam Grant 1 173 Adam Grant 2 173 Adam Grant 3 156 Adam Grant 4 155 Adam Grant 5 152 Adam Grant 6 148 Adam Grant 7 141
WHERE fullname = 'Alan Grant' works perfectly. With f_rank I get the following error:
column "f_rank" does not exist
What am I doing wrong here? I´m totally confused.
Advertisement
Answer
You can’t use a column alias defined in the select. But, it doesn’t make sense to do the ranking on the name of the actor when you can do it on the id. If that meets your needs, just move the logic to the subquery:
SELECT fullname, f_rank, length
FROM (SELECT a.first_name || ' ' || a.last_name as fullname, f.length,
ROW_NUMBER() OVER (PARTITION BY a.actor_id ORDER BY f.length DESC) as f_rank
FROM film_actor fa JOIn
film f
ON fa.film_id = f.film_id JOIN
actor a
ON fa.actor_id = a.actor_id
) af
WHERE f_rank <= 3