SQL Среднее время прибытия, время между датами - PullRequest
5 голосов
/ 17 марта 2011

У меня есть таблица с последовательными временными метками:

2011-03-17 10: 31: 19

2011-03-17 10: 45: 49

2011-03-17 10:47:49 ...

Мне нужно найти среднюю разницу во времени между каждым из них (их может быть несколько десятков) в секундах или что-либо еще, я могу работать с этим оттуда Так, например, указанное выше время прибытия только для первых двух раз будет 870 (14 м 30 с). Для всех трех раз это будет: (870 + 120) / 2 = 445 (7 м 25 с).

Примечание. Я использую postgreSQL 8.1.22.

РЕДАКТИРОВАТЬ: Таблица, которую я упоминал выше, из другого запроса, который буквально представляет собой список меток времени в один столбец

Ответы [ 3 ]

15 голосов
/ 17 марта 2011

Не уверен, что я полностью понял ваш вопрос, но это может быть то, что вы ищете:

SELECT avg(difference)
FROM ( 
  SELECT timestamp_col - lag(timestamp_col) over (order by timestamp_col) as difference
  FROM your_table
) t

Внутренний запрос вычисляет расстояние между каждой строкой и предыдущей строкой.Результатом является интервал для каждой строки в таблице.

Внешний запрос просто делает среднее значение по всем различиям.

1 голос
/ 18 марта 2011

Если вы не можете выполнить обновление до версии PG, которая поддерживает оконные функции, вы можете вычислить последовательные шаги вашей таблицы «медленным путем».

Предполагая, что ваша таблица - «tbl», а столбец отметки времени - «ts»":

SELECT AVG(t1 - t0)
  FROM (
        -- All this silliness would be moot if we could use
        -- `` lead(ts) over (order by ts) ''
        SELECT tbl.ts  AS t0,
               next.ts AS t1
          FROM tbl
         CROSS JOIN
               tbl next
         WHERE next.ts = (
                          SELECT MIN(ts)
                            FROM tbl subquery
                           WHERE subquery.ts > tbl.ts
                         )
       ) derived;

Но не делай этого.Его производительность будет ужасной.Пожалуйста, сделайте то, что предлагает a_horse_with_no_name, и используйте оконные функции .

1 голос
/ 17 марта 2011

Я думаю, вы хотите найти AVG (timestamptz).

Мое решение - avg (текущее - минимальное значение).но так как результат - интервал, добавьте его к минимальному значению снова.

SELECT  avg(target_col - (select min(target_col) from your_table))
        + (select min(target_col) from your_table)
FROM    your_table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...