0

我有一个查询。我在使用 row_number 时按顺序使用别名,我得到了

[42703] 错误:列“total_comments”不存在错误位置:335

我怎样才能解决这个问题?

 select
      cr_seller_history_id,
      c.created_at,
      company_name,
      business_name,
      brand,
      kep_mail,
      address,
      phone,
      mail,
      slug,
      name,
      point,
      contact_positive,
      contact_negative,
      product_number,
      (product_positive + product_negative) as total_comments,
      ROW_NUMBER() OVER(ORDER BY total_comments) as rank
    from cr_companies a
      INNER JOIN cr_sellers b ON a.cr_company_id = b.cr_company_id
      INNER JOIN cr_seller_histories c ON b.cr_seller_id = c.cr_seller_id
      WHERE DATE(c.created_at) = DATE 'yesterday'
    ORDER BY total_comments DESC NULLS LAST
4

2 回答 2

1

其他解决方案是子查询、CTE 或横向连接。所以,你可以写:

select . . . 
      v.total_comments,
      row_number() over (order by v.total_comments) as rank
from cr_companies c join
     cr_sellers s
     on c.cr_company_id = s.cr_company_id join
     cr_seller_histories sh
     on s.cr_seller_id = sh.cr_seller_id, lateral
     (values (product_positive + product_negative)) v(total_comments)
where DATE(c.created_at) = date 'yesterday'
order by v.total_comments desc nulls last;

请注意,我还将表别名更改为表名的缩写。这是一种最佳实践,可以更轻松地编写、读取和修改查询。

于 2018-05-27T12:16:57.140 回答
0

问题出在:

ROW_NUMBER() OVER(ORDER BY total_comments) as rank

你不能像这样使用别名 -order by在选择中接受别名,而不是在窗口函数中:

https://www.postgresql.org/docs/current/static/sql-select.html#SQL-SELECT-LIST

输出列的名称可用于在 ORDER BY 和 GROUP BY 子句中引用列的值,但不能在 WHERE 或 HAVING 子句中引用;在那里你必须写出表达式。

而是尝试:

ROW_NUMBER() OVER(ORDER BY (product_positive + product_negative)) as rank

或使用子查询 - 然后别名可以在窗口函数中使用

于 2018-05-27T11:15:04.223 回答