Postgresql: среднее значение для каждого дня в интервале - PullRequest
0 голосов
/ 11 января 2019

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

item_id    first_observed    last_observed    price
1          2016-10-21        2016-10-27       121
1          2016-10-28        2016-10-31       145
2          2016-10-22        2016-10-28       135
2          2016-10-29        2016-10-30       169

Я хочу получить среднюю цену за каждый день. Очевидно, я не могу просто группировать по first_observed или last_observed. Postgres предлагает умный способ сделать это?

Ожидаемый результат будет следующим:

date        avg(price)
2016-10-21  121
2016-10-22  128
2016-10-23  128
2016-10-24  128
2016-10-25  128
2016-10-26  128
2016-10-27  128
2016-10-28  140
2016-10-29  157
2016-10-30  157
2016-10-31  157

Я также мог бы выводиться так (оба в порядке):

start       end         avg(price)
2016-10-21  2016-10-21  121
2016-10-22  2016-10-27  128
2016-10-28  2016-10-28  140
2016-10-29  2016-10-31  157

Ответы [ 2 ]

0 голосов
/ 11 января 2019

демо: дб <> скрипка

generate_series позволяет расширить диапазоны дат:

Первый шаг:

SELECT 
    generate_series(first_observed, last_observed, interval '1 day')::date as observed, 
    AVG(price)::int as avg_price
FROM items
GROUP BY observed
ORDER BY observed
  1. расширение диапазона дат
  2. группировка дат для совокупности AVG

Второй шаг

SELECT 
    MIN(observed) as start,
    MAX(observed) as end,
    avg_price
FROM (
    -- <first step as subquery>
)s
GROUP BY avg_price
ORDER BY start
  1. Группировка по avg_price для получения MIN / MAX даты для нее
0 голосов
/ 11 января 2019
WITH ObserveDates (ObserveDate) AS (
    SELECT * FROM generate_series((SELECT MIN(first_observed) FROM T), (SELECT MAX(last_observed) FROM T), '1 days')
)
SELECT ObserveDate, AVG(Price)
FROM ObserveDates
JOIN T ON ObserveDate BETWEEN first_observed AND last_observed
GROUP BY ObserveDate
ORDER BY ObserveDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...