Написать запрос для вычисления среднего значения

Имеется таблица в postgres, в ней есть столбец 'дата производства' типа Date и содержит записи вида '2020-02-02'. Нужно вычислить среднее значение этого столбца, получить в виде количества лет и месяцев, например:'2 года 3 месяца', при это не использовать никакие функции, то есть не использовать avg() и другие, можно использовать только +,+,/,*. Как это сделать?


Ответы (1 шт):

Автор решения: ValNik

Мне стало любопытно - откуда такое ограничение на использование агрегатных функций? Может это учебный пример и нужно написать процедуру?
Если в виде запроса, посмотрите пример. Здесь вместо цикла - рекурсия. А идея та же самая - сложить все возрасты и поделить)

with recursive t as(
  select * 
    ,row_number()over(order by proddate) rn
    ,count(*)over() maxn
  from test
)
, r as(
select id,proddate-proddate tv,proddate mindate,rn,maxn,proddate from t where rn=1
union all
select t.id, r.tv+t.proddate-r.mindate tv, r.mindate,t.rn,r.maxn,t.proddate
  from r inner join t on t.rn=(r.rn+1)
)
select id,proddate,tv,tv/rn age_days,justify_days ( tv/rn ) -- ,mindate,maxn
from r
--where rn=maxn;

Результат запроса

id proddate tv age_days justify_days
1 2020-01-01 00:00:00 00:00:00 00:00:00 00:00:00
2 2021-01-11 00:00:00 376 days 188 days 6 mons 8 days
3 2022-01-21 00:00:00 1127 days 375 days 16:00:00 1 year 15 days 16:00:00
4 2023-01-31 00:00:00 2253 days 563 days 06:00:00 1 year 6 mons 23 days 06:00:00

В примере tv - суммарный возраст от начала списка по текущую запись, age_days - средний возраст по записям от начала списка по текущую. Самая первая (по rn и Proddate) имеет возраст 0. Если нужно только одно значение, раскомментируйте последнюю строку - условие отбора.

→ Ссылка