Расчет промежутков времени в PostgreSQL

В моей базе данных PostgreSQL у меня есть следующая схема:

CREATE TABLE programs (
    id integer,
    description text
);

CREATE TABLE public.messages (
    id integer,
    program_id integer,
    text text,
    created_at timestamp with time zone
);

INSERT INTO programs VALUES(1, 'Test program');

INSERT INTO messages VALUES(1,1, 'Test message 1', now() - interval '7 days');
INSERT INTO messages VALUES(2,1, 'Test message 2', now() - interval '4 days');
INSERT INTO messages VALUES(3,1, 'Test message 3', now() - interval '1 days');

Я хочу рассчитать промежутки между created_at в таблице сообщений. Это должно работать следующим образом:

  1. Вычислить промежуток между created_at первого и второго сообщения.
  2. Вычислите промежуток между created_at второго и третьего сообщения.
  3. Рассчитайте средний разрыв на основе этих значений.

Есть ли способ сделать это в PostgreSQL?

https://www.db-fiddle.com/f/gvxijmp8u6wr6mYcSoAeVV/0

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
152
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вам нужно среднее время между сообщениями, нет необходимости получать последовательные различия. Просто посмотрите на самые старые и самые новые сообщения:

select program_id,
       (max(created_at) - min(created_at)) / nullif (count(*) - 1, 0)
from messages
group by program_id;
Ответ принят как подходящий

Используя LAG и оконный AVG, чтобы получить как разницу, так и средний разрыв:

WITH cte AS (
  SELECT *, 
  created_at-LAG(created_at) OVER(PARTITION BY program_id ORDER BY created_at) gap
  FROM messages
)
SELECT *, AVG(gap) OVER(PARTITION BY program_id) AS avg_gap
FROM cte;

db<>демонстрация скрипки

Другие вопросы по теме