2

为什么会出现以下查询:

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

4

2 回答 2

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子句。rownum

根据文档

仅允许在查询的SELECT列表和ORDER BY 子句中使用窗口函数。它们在其他地方被禁止,例如 inGROUP BY和 子句。这是因为它们在处理这些子句之后在逻辑上执行。此外,窗口函数在常规聚合函数之后执行。这意味着在窗口函数的参数中包含聚合函数调用是有效的,但反之则不然。HAVINGWHERE

于 2013-02-23T01:18:09.757 回答
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;
于 2013-02-23T01:19:04.557 回答