代码之家  ›  专栏  ›  技术社区  ›  SNaRe

在orderby中使用别名时如何获取行号

  •  0
  • SNaRe  · 技术社区  · 6 年前

    我有个问题。我在使用行号时使用别名排序,然后

    [42703]错误:“总注释”列不存在错误位置: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
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Vao Tsun    6 年前

    问题在于:

    ROW_NUMBER() OVER(ORDER BY total_comments) as rank
    

    不能这样使用别名- order by 接受select中的别名,而不是window函数中的别名:

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

    输出列的名称可用于引用中该列的值。 按条款排序和分组,但不在WHERE或HAVING条款中; 在这里,您必须改为写出表达式。

    请尝试:

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

    或者使用子查询-那么别名可以在窗口函数中使用

        2
  •  1
  •   Gordon Linoff    6 年前

    其他解决方案是子查询、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;
    

    请注意,我还将表别名更改为表名的缩写。这是一个最佳实践,使编写、读取和修改查询更加容易。