В моей базе данных 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 в таблице сообщений. Это должно работать следующим образом:
created_at первого и второго сообщения.created_at второго и третьего сообщения.Есть ли способ сделать это в PostgreSQL?


Если вам нужно среднее время между сообщениями, нет необходимости получать последовательные различия. Просто посмотрите на самые старые и самые новые сообщения:
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;