Postgres窗口函数语法

时间:2013-02-23 01:10:06

标签: sql postgresql window-functions

为什么会出现以下问题:

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_idtime都是users上定义的列。

2 个答案:

答案 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}}子句中应用下一个查询级别。

Per documentation

  

仅允许在rownum列表和SELECT中使用窗口函数   查询的子句。在其他地方禁止使用它们,例如ORDER BY,   GROUP BYHAVING条款。这是因为它们在逻辑上执行   在处理这些条款之后。此外,窗口函数执行   经常聚合功能后。这意味着它包含有效   一个聚合函数调用窗口函数的参数,但是   反之亦然。

答案 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;