Можно ли сделать дополнительную агрегацию в предложении фильтра? (PostgreSQL) - PullRequest
0 голосов
/ 27 мая 2020

Я хочу написать что-то вроде этого:

  select 
    "id", 
    "plant", 
    "product", 
    "uom", 
    count(*) as transactions_count,
    avg(("invoice_price" / "quantity")) filter (where ("date" == max(date))  as "LAST_GUIDANCE", -- I want group by date only for this
  from "transactions"
  group by 
    "id", 
    "plant", 
    "product", 
    "uom"

Где я хочу посчитать последнее руководство, но только для строк с последней датой.

Проблема в том, что я не могу добавить «дату» для группировки, потому что я хочу эту группировку только для last_guidance .. Можно как-то легко записать это в Postgres (например, использовать "over") или мне нужно создать слишком отдельные запросы, а затем присоединиться к ним?

Спасибо за ответы

1 Ответ

1 голос
/ 27 мая 2020

Это недопустимо. Сообщение об ошибке довольно ясное:

ОШИБКА: агрегатные функции не разрешены в СТРОКА ФИЛЬТРА 1: выберите фильтр count (*) (где x = max (x))

Также не разрешены оконные функции.

Вы можете использовать подзапрос для вычисления максимальной даты:

select id, plan, product, uom,
       count(*) as transactions_count,
       avg(invoice_price / quantity) filter (where date = max_date)  as LAST_GUIDANCE
from (select t.*, 
             max(date) over (partition by id, plan, product, uom) as max_date
      from transactions t
     ) t
group by id, plan, product, uom;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...