【问题标题】:How do I get the average date interval of a column in SQL?如何获取 SQL 中列的平均日期间隔?
【发布时间】:2018-10-28 21:43:01
【问题描述】:

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

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

  • 用户12345平均互动间隔为1天

我已经尝试使用窗口函数,但我无法获得平均值,因为 PostgreSQL 不允许我在窗口函数上使用 GROUP BY 或 AVG,我可以使用以下命令获取间隔,但不能t 根据用户 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;

但是这个函数只返回几行一列的空值。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 是的,它有,但用户交互没有排序。用户 X 可以在一些用户 Y 交互之间进行交互。但是interaction_id是有顺序的!

标签: sql postgresql date group-by average


【解决方案1】:

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

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;

【讨论】:

  • 小错误:'order by' 前的逗号。修复后似乎可以解决问题。 :)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多