• Как в posgresql получить среднее в разных интервалах?

    @galaxy
    По интервалам в 1 год/месяц/день/час/минуту:
    select date_trunc('hour', e.created), avg(e.value) from table e group by 1 order by 1

    (вместо hour - year/month/day ...)

    Но вообще задача у вас не совсем четко определена: интервал начинается в начале соответствующего календарного периода или необязательно? Т.е. если группируем по дням, дни идут с 0:00:00 по 23:59:59 или, скажем, взяли произвольный стартовый момент (пусть 2019-08-03 14:25:44) и от него считаем (т.е. дни с 14:25:44 по 14:25:43 следующего дня)?
    Это еще более значимо для случая периодов типа 7 часов, или 23 минуты. Например, считая с начала какого-то дня периоды по 7 часов могут идти так:
    [00:00-07:00)
    [07:00-14:00)
    [14:00-21:00)
    [21:00-00:00) - следующий день
    [00:00-07:00) - следующий день

    или так:
    [00:00-07:00)
    [07:00-14:00)
    [14:00-21:00)
    [21:00-03:00) - следующий день
    [03:00-10:00) - следующий день
    ...


    для первого случая как-то так:
    select date_trunc('day', e.created) + (trunc(extract('hour' from e.created) / 7) * 7 || ' hour')::interval, avg(e.value) from table e group by 1 order by 1

    не особо проще вашего, как видите
    Ответ написан
    1 комментарий