Sql WHERE子句=>列的子查询不存在

Sql WHERE子句=>列的子查询不存在,sql,postgresql,where-clause,Sql,Postgresql,Where Clause,我试图为每一位演员获得每部电影前三名的长度。我的问题看起来像是我的问题 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

我试图为每一位演员获得每部电影前三名的长度。我的问题看起来像是我的问题

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
其中fullname='Alan Grant'非常有效。对于f_秩,我得到以下错误:

column "f_rank" does not exist

我做错了什么?我完全糊涂了。

您不能使用select中定义的列别名。但是,如果可以在id上进行排名,那么在演员姓名上进行排名是没有意义的。如果这符合您的需要,只需将逻辑移到子查询:

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

在“选择”中定义的列别名不能在该选择的“位置”中引用。使用CTE或子查询。从。。。选择WHERE-SELECT中定义的列不能用于同一级别的WHERE
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