#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