Как получить средний интервал дат столбца в SQL? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть таблица взаимодействий пользователей на веб-сайте, и мне нужно рассчитать среднее время между взаимодействиями каждого пользователя.Чтобы сделать его более простым для понимания, вот некоторые записи таблицы:

Table of user interactions

Где первый столбец - это идентификатор пользователя, а второй - время взаимодействия.Результаты, которые мне нужны, это среднее время между взаимодействиями каждого пользователя.Пример:

  • Средний интервал взаимодействия пользователя 12345 составляет 1 день

Я уже пытался использовать оконные функции, но не смог получить среднее значение, потому что PostgreSQL неМне не разрешалось использовать GROUP BY или AVG для оконных функций, я мог получить интервалы с помощью следующей команды, но не смог сгруппировать их по идентификатору пользователя.

SELECT INTERACTION_DATE - LAG(INTERACTION_DATE ) OVER (ORDER BY INTERACTION_DATE ) 

Итак, я решил создатьмоя собственная пользовательская функция, и после этого создайте пользовательскую агрегатную функцию, чтобы сделать это, и используйте эту функцию в выражении group by:

CREATE OR REPLACE FUNCTION DATE_INTERVAL(TIMESTAMP)  
     RETURNS TABLE (USER_INTERVALS INTERVAL) 
AS $$
  SELECT $1 - LAG($1) OVER (ORDER BY $1) 
$$
LANGUAGE SQL
IMMUTABLE;

Но эта функция возвращает только несколько строк с одним столбцом с нулевым значением.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Инкапсулируйте ваш первый запрос, затем вычислите среднее значение:

SELECT AVG(InteractionTime) FROM (
    SELECT INTERACTION_DATE - LAG(INTERACTION_DATE ) OVER (ORDER BY INTERACTION_DATE ) AS InteractionTime
)
0 голосов
/ 18 мая 2018

Сначала необходимо рассчитать разницу между взаимодействиями для каждой строки (и пользователя), а затем вычислить среднее значение для этого:

select user_id, avg(interaction_time)
from (
   select user_id, 
          interaction_date - lag(interaction_date) over (partition by user_id order by interaction_date) as interaction_time
   from the_table
) t
group by user_id;
...