Рассчитать средний прирост веса - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть следующая таблица:

ganado_id created     weight
1         2018-12-24  285
2         2018-12-24  288
2         2018-10-13  241
1         2018-10-13  244
1         2018-08-11  202

Мне нужно рассчитать средний прирост веса для каждого ganado_id.Желаемый результат:

ganado_id avg_weight_gain
1         0.618
2         0.652

Среднее увеличение веса для ganado_id = 1 рассчитывается следующим образом:

SELECT ((285 - 244)::NUMERIC / ('2018-12-24'::DATE - '2018-10-13'::DATE)::NUMERIC + (244 - 202)::NUMERIC / ('2018-10-13'::DATE - '2018-08-11'::DATE)::NUMERIC) / 2

Среднее увеличение веса для ganado_id = 2 рассчитывается следующим образом:

SELECT (288 - 241)::NUMERIC / ('2018-12-24'::DATE - '2018-10-13'::DATE)::NUMERIC

В производстве может быть от 1 до 15 записей веса (первая таблица) для каждого ganado_id

1 Ответ

0 голосов
/ 26 декабря 2018

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

with gains as (
  select
    ganado_id, weight, created,
    weight - lag (weight) over (partition by ganado_id order by created) as gain,
    created - lag (created) over (partition by ganado_id order by created) as days
  from table1
)
select
  ganado_id, sum (gain) * 1.0 / sum (days) as avg_gain
from gains
group by
  ganado_id

- РЕДАКТИРОВАТЬ -

В соответствии с вашими отзывами это будетбыть средним из средних значений:

with gains as (
  select
    ganado_id, weight, created,
    1.0 * (weight - lag (weight) over (partition by ganado_id order by created)) /
    (created - lag (created) over (partition by ganado_id order by created)) as gain_per_day
  from table
)
select
  ganado_id, avg (gain_per_day)
from gains
group by
  ganado_id

Результаты:

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