Основываясь на ответе Эрвина, вот полный запрос для подсчета количества времени, проведенного людьми на этих сессиях / островах:
Мои данные отображаются только тогда, когда люди закончили что-то просматривать, а не когда они начали, а это значит, что мы не знаем, когда сессия действительно началась; и у некоторых островов есть только одна временная метка (что приводит к оценке продолжительности 0). Я учитываю как вычисление среднего времени просмотра, так и добавление его к общей продолжительности островов.
Это, вероятно, очень необычно для моего варианта использования, но я изучил одну или две вещи в процессе, так что, возможно, это поможет кому-то в дальнейшем.
-- Returns estimated total study time and average time per review, both in seconds
SELECT (EXTRACT( EPOCH FROM logged) + countofislands * avgreviewtime) as totalstudytime, avgreviewtime -- add total logged time to estimate for first-review-in-island and 1-review islands
FROM
(
SELECT -- get the three key values that will let us calculate total time spent
sum(duration) as logged
, count(island) as countofislands
, EXTRACT( EPOCH FROM sum(duration) FILTER (WHERE duration != '00:00:00'::interval) )/( sum(reviews) FILTER (WHERE duration != '00:00:00'::interval) - count(reviews) FILTER (WHERE duration != '00:00:00'::interval)) as avgreviewtime
FROM
(
SELECT island, age( max(done), min(done) ) as duration, count(island) as reviews -- calculate the duration of islands
FROM
(
SELECT done, count(*) FILTER (WHERE step) OVER (ORDER BY done) AS island -- give a unique number to each island
FROM (
SELECT -- detect the beginning of islands
done,
(
lag(done) OVER (ORDER BY done) <= done - interval '2 min'
) AS step
FROM review
WHERE clicker_id = 71 AND "done" > '2015-05-13' AND "done" < '2015-05-13 15:00:00' -- keep the queries small and fast for now
) sub
ORDER BY done
) grouped
GROUP BY island
) sessions
) summary