为什么会出现以下问题:
select ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY time DESC) as rownum FROM users where rownum < 20;
产生以下错误?
ERROR: column "rownum" does not exist
LINE 1: ...d ORDER BY time DESC) as rownum FROM users where rownum < 2...
如何构建此查询以便获取前窗口函数定义的前20个项目?
user_id
和time
都是users
上定义的列。
答案 0 :(得分:6)
它会像这样工作:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY time DESC) AS rownum
FROM users
) x
WHERE rownum < 20;
这里的重点是事件的顺序。窗口函数在WHERE
子句后应用。因此,rownum
尚不可见。您必须将其放入子查询或CTE中,并在WHERE
的{{1}}子句中应用下一个查询级别。
仅允许在
rownum
列表和SELECT
中使用窗口函数 查询的子句。在其他地方禁止使用它们,例如ORDER BY
,GROUP BY
和HAVING
条款。这是因为它们在逻辑上执行 在处理这些条款之后。此外,窗口函数执行 经常聚合功能后。这意味着它包含有效 一个聚合函数调用窗口函数的参数,但是 反之亦然。
答案 1 :(得分:1)
因为where
子句在select之前执行所以它还不知道该别名。这样做:
select *
from (
select ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY time DESC) as rownum
FROM users
) s
where rownum < 20;