Один из многих возможных способов: отложить, присоединиться, в боковом подзапросе:
SELECT *
FROM tbl t
LEFT JOIN LATERAL (
SELECT avg(a2.ts - a1.ts) AS avg_intv
FROM unnest(t.arr) WITH ORDINALITY a1(ts, ord)
JOIN unnest(t.arr) WITH ORDINALITY a2(ts, ord) ON (a2.ord = a1.ord + 1)
) avg ON true;
db <> скрипка здесь
[INNER] JOIN
в подзапросе производит именно набор комбинаций, относящихся к интервалам между элементами.
Я получаю 371 days 14:37:06.587543
, а не '- 368d' ,Кстати.
Связано с более подробным объяснением:
Вы также можете только unnestодин раз и используйте оконные функции lead()
или lag()
, но вы пытались избежать оконных функций.И вам нужно убедиться в исходном порядке элементов в любом случае ...
(Нет функции массива , которую вы могли бы использовать напрямую, чтобы получить то, что вынужно - в случае, если вы надеялись на это.)
Альтернатива с CTE
Может быть привлекательным для отмены только один раз (даже без использования оконных функций):
SELECT *
FROM tbl t
LEFT JOIN LATERAL (
WITH a AS (SELECT * FROM unnest(t.arr) WITH ORDINALITY a1(ts, ord))
SELECT avg(a2.ts - a1.ts) AS avg_intv
FROM a a1
JOIN a a2 ON (a2.ord = a1.ord +1)
) avg ON true;
Но я ожидаю, что дополнительные накладные расходы CTE будут стоить больше, чем неоплачиваемые в два раза.В основном просто демонстрация предложения WITH
в подзапросе.