Написать запрос для вычисления среднего значения
Имеется таблица в postgres, в ней есть столбец 'дата производства' типа Date и содержит записи вида '2020-02-02'. Нужно вычислить среднее значение этого столбца, получить в виде количества лет и месяцев, например:'2 года 3 месяца', при это не использовать никакие функции, то есть не использовать avg() и другие, можно использовать только +,+,/,*. Как это сделать?
Ответы (1 шт):
Мне стало любопытно - откуда такое ограничение на использование агрегатных функций? Может это учебный пример и нужно написать процедуру?
Если в виде запроса, посмотрите пример. Здесь вместо цикла - рекурсия. А идея та же самая - сложить все возрасты и поделить)
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. Если нужно только одно значение, раскомментируйте последнюю строку - условие отбора.