如何在SQL中获取列的平均日期间隔?

如何在SQL中获取列的平均日期间隔?,sql,postgresql,date,group-by,average,Sql,Postgresql,Date,Group By,Average,我有一个网站上的用户交互表,我需要计算每个用户交互之间的平均时间。为了使其更易于理解,以下是该表的一些记录: 其中第一列是用户id,第二列是交互时间。我需要的结果是每个用户交互之间的平均时间。例如: 用户12345的平均交互间隔为1天 我已经尝试使用窗口函数,但无法获得平均值,因为PostgreSQL不允许我在窗口函数上使用GROUP BY或AVG,我可以使用以下命令获得间隔,但无法基于用户id对其进行分组 SELECT INTERACTION_DATE - LAG(INTERACTION

我有一个网站上的用户交互表,我需要计算每个用户交互之间的平均时间。为了使其更易于理解,以下是该表的一些记录:

其中第一列是用户id,第二列是交互时间。我需要的结果是每个用户交互之间的平均时间。例如:

  • 用户12345的平均交互间隔为1天
我已经尝试使用窗口函数,但无法获得平均值,因为PostgreSQL不允许我在窗口函数上使用GROUP BY或AVG,我可以使用以下命令获得间隔,但无法基于用户id对其进行分组

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;
但是这个函数只返回几行和一列的空值


有更好的方法吗?

您需要首先计算每行(和用户)交互之间的差异,然后计算平均值:

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;

封装第一个查询,然后计算平均值:

SELECT AVG(InteractionTime) FROM (
    SELECT INTERACTION_DATE - LAG(INTERACTION_DATE ) OVER (ORDER BY INTERACTION_DATE ) AS InteractionTime
)

是的,它有,但用户交互没有顺序。用户X可以在一些用户Y交互之间进行交互。但是交互id是按顺序排列的!轻微打字错误:“订购人”前的逗号。似乎在修复后完成了此操作。:)