sql - 在 WHERE 中使用 ROW_NUMBER() 别名

标签 sql postgresql

<分区>

在 Postgresql 9.1+ 中,我尝试使用 ROW_NUMBER() 别名字段过滤 WHERE 子句中的结果集。此查询工作正常:

SELECT inv.client_pk, 
       inv.invoice_pk, inv.contract_pk, 
       ROW_NUMBER() OVER ( PARTITION BY inv.client_pk ORDER BY inv.client_pk) as row_number 
FROM controllr.client as cli 
  LEFT JOIN controllr.invoice as inv ON inv.client_pk = cli.client_pk                              
WHERE client_status != 3;

但是当我在 WHERE 中添加“row_number”时:

SELECT inv.client_pk, 
       inv.invoice_pk, inv.contract_pk, 
       ROW_NUMBER() OVER ( PARTITION BY inv.client_pk ORDER BY inv.client_pk) as row_number 
FROM controllr.client as cli 
  LEFT JOIN controllr.invoice as inv ON inv.client_pk = cli.client_pk                              
WHERE client_status != 3 
  AND row_number <= 3;

它给了我一个错误:

column "row_number" does not exist

当字段“row_number”作为别名字段明确存在时。

我做错了什么?

ps: 我已经尝试过 HAVING 子句

最佳答案

使用子查询:

SELECT 
    *
FROM
    (SELECT 
         inv.client_pk, inv.invoice_pk, inv.contract_pk, 
         ROW_NUMBER() OVER (PARTITION BY inv.client_pk ORDER BY inv.client_pk) AS row_number 
     FROM 
         controllr.client as cli 
     LEFT JOIN 
         controllr.invoice as inv ON inv.client_pk = cli.client_pk                              
     WHERE 
         client_status != 3) AS sub
WHERE 
    row_number <= 3;

使用 CTE:

WITH cte AS 
(
    SELECT 
        inv.client_pk, inv.invoice_pk, inv.contract_pk, 
        ROW_NUMBER() OVER ( PARTITION BY inv.client_pk ORDER BY inv.client_pk) AS row_number 
    FROM 
        controllr.client as cli 
    LEFT JOIN 
        controllr.invoice as inv ON inv.client_pk = cli.client_pk                              
    WHERE 
        client_status != 3
)
SELECT *
FROM cte
WHERE row_number <= 3;

您收到该错误的原因是 WHERE子句在 SELECT 之前处理条款。因此,引擎无法看到 row_number作为尝试处理条件 ... row_number <= 3 时的列与您的原始查询。

此外,使用 CTE 与使用子查询具有相同的性能,但它确实提高了可读性。

关于sql - 在 WHERE 中使用 ROW_NUMBER() 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48956679/

相关文章:

mysql - SQL ROW_NUMBER 给出错误

mysql - 从带连接的总和中查询排名靠前的值

sql - 跨不同值生成的增量数

sql - JSON 上的 PostgreSQL 索引

mysql - 将 SQL 更新语句转换为 View 语句

ruby-on-rails - 列必须出现在 GROUP BY 子句中或用于聚合函数 Ruby

postgresql - Azure DevOps CI 中 Azure 服务集成的自动化集成测试

postgresql - 提高 PostgreSQL 中自定义聚合函数的性能

sql - Postgresql按乱序排序

sql - 函数不返回预期值