Как получить номер строки при использовании псевдонима в порядке - PullRequest
0 голосов
/ 27 мая 2018

У меня есть запрос.Я использую псевдоним по порядку, при использовании 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

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Другие решения - это подзапрос, 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;

Обратите внимание, что я также изменил псевдонимы таблиц, чтобы они стали сокращениями для имен таблиц.Это лучшая практика, которая значительно упрощает написание, чтение и изменение запросов.

0 голосов
/ 27 мая 2018

проблема в:

ROW_NUMBER() OVER(ORDER BY total_comments) as rank

вы не можете использовать псевдоним как этот - order by принимает псевдоним в select, а не в оконной функции:

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

или использовать подзапрос - тогда псевдоним можно использовать в оконной функции

...