Необходимо ограничить количество строк, усредняемых этим запросом — с помощью postgres AVG

#sql #postgresql #datetime #average #date-arithmetic

#sql #postgresql #дата и время #среднее #дата-арифметика

Вопрос:

Нужна помощь / Что я хотел бы сделать, так это ограничить количество строк, из которых этот запрос получает среднее значение. Я пытался ограничить количество строк, но понял, что запрос возвращает только 1 строку, среднее значение, поэтому ограничение ничего не дало. В идеале я хотел бы вернуть 10 самых последних раз «handled_at» и усреднить только их.

 SELECT
  avg(
    (
      (
        DATE_PART(
          'day',
          handled_at :: TIMESTAMP - created_at :: timestamp
        ) * 24   DATE_PART(
          'hour',
          handled_at :: TIMESTAMP - created_at :: timestamp
        )
      ) * 60   DATE_PART(
        'minute',
        handled_at :: TIMESTAMP - created_at :: timestamp
      )
    ) * 60   DATE_PART(
      'second',
      handled_at :: TIMESTAMP - created_at :: timestamp
    )
  ) / 60
FROM
  registrations
WHERE
  state = 'admitted'
  AND registration_queue_id = 36
  

Ответ №1:

Это то, что вы хотите?

 select avg(extract(epoch from handled_at - created_at)) avg_diff_seconds
from (
    select *
    from registrations
    order by handled_at desc
    limit 10
) r
  

В основном это выбирает 10 последних строк, как определено handled_at , а затем усредняет разницу между handled_at и created_at по этим строкам.

Обратите внимание, что я упростил арифметику даты: нет необходимости в нескольких date_parts() , это просто вычисляет результаты за считанные секунды.

Я также удалил timestamp приведение; в этом нет необходимости, если только вы не храните свои значения в строковом формате (что плохо!). Вы можете вернуть его обратно, если это действительно необходимо по какой-то причине.

Комментарии:

1. Это довольно здорово. Я попытался выполнить некоторые вычисления, чтобы перейти на минуты и округлить до ближайших 5. В моей старой формуле, которая выглядела так: ВЫБЕРИТЕ round(avg(((DATE_PART(‘day’, handled_at::TIMESTAMP — created_at::timestamp) * 24 DATE_PART(‘hour’, handled_at::TIMESTAMP — created_at::timestamp)) * 60 DATE_PART(‘минута’, обработано_at::TIMESTAMP — created_at::timestamp)) * 60 DATE_PART(‘second’, обработано_at::TIMESTAMP — created_at::timestamp))/60)/5)*5 ИЗ регистраций, ГДЕ state = ‘допущен’ И registration_queue_id=36