postgresql: использовать результат из вспомогательной вспомогательной функции в select - PullRequest
0 голосов
/ 06 апреля 2020

Во вспомогательной функции я использую функцию aggegate (count), поэтому она дает только один результат, без столбца. Позже я хочу использовать результат функции в своем запросе:

with total as  (select count(*) from employees)
select emp_no, (cast (rank() over (order by emp_no) as Float))/total
from employees

Однако это приводит к ошибке:

столбец "total" не существует

Я интерпретирую ошибку следующим образом: один (совокупный) результат необходимо преобразовать в столбец. Как я могу решить это? Есть ли способ решить это (эффективно)?

Я прочитал несколько ссылок о WITH (например, https://www.tutorialspoint.com/postgresql/postgresql_with_clause.htm), но в предложении WITH всегда есть таблица, а не одно значение, как в моем случае.

1 Ответ

0 голосов
/ 06 апреля 2020

но в предложении WITH всегда создается таблица, а не одно значение, как в моем случае.

A CTE всегда создает таблицу " ». Даже ваш CTE - так получилось, что ваш CTE всегда содержит ровно один столбец и одну строку.


Причиной ошибки является тот факт, что ваш последний запрос не ссылается на CTE с именем total и поэтому не может получить к нему доступ (или к его столбцу).

Вам необходимо включить CTE total в предложение from вашего последнего оператора SELECT:

with total as (
  select count(*) as emp_count
  from employees
)
select emp_no, (cast (rank() over (order by emp_no) as Float)) / emp_count
from employees
  cross join total;

Вы можете упростить выражение в конечном SELECT, если вы приведете считать до числа (или числа с плавающей запятой):

with total as (
  select count(*)::float as emp_count
  from employees
)
select emp_no, 
       rank() over (order by emp_no) / emp_count
from employees
  cross join total;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...