PostgreSQL计算连续会话

PostgreSQL计算连续会话,postgresql,calculated-columns,Postgresql,Calculated Columns,我有一个非常大的表,其中包含4列:1)成员的status属性已更改为: 联机、脱机、游戏厅、加载屏幕2)成员的状态属性已从:联机、脱机、游戏厅和加载屏幕3)成员的ID号和4)状态属性更改时的时间戳)。我想计算所有成员在线花费的平均时间,即状态从在线变为离线的时间戳与状态从离线变为在线的时间戳之间的差值: 使用上面链接的样本,计算的平均值为(01/03/2016 15:32:05-01/02/2016 07:18:32+03/14/2016 05:46:41-03/14/2016 04:09:0

我有一个非常大的表,其中包含4列:1)成员的status属性已更改为: 联机、脱机、游戏厅、加载屏幕2)成员的状态属性已从:联机、脱机、游戏厅和加载屏幕3)成员的ID号和4)状态属性更改时的时间戳)。我想计算所有成员在线花费的平均时间,即状态从在线变为离线的时间戳与状态从离线变为在线的时间戳之间的差值:

使用上面链接的样本,计算的平均值为(01/03/2016 15:32:05-01/02/2016 07:18:32+03/14/2016 05:46:41-03/14/2016 04:09:04) )/二,

以下是我写的,它给了我一些负的平均数,这些平均数是为某些成员计算的,这不可能是正确的:

with sessions as
( select 
    date_trunc('week', sc.occurred_at) as week,
    sc.occurred_at,
    sc.id,
    timestampdiff(second,lag(sc.occurred_at) over (order by sc.id asc, sc.occurred_at),
    sc.occurred_at)/3600 as session
  from state_changes sc
  where
    ((from_state = 'offline' and to_state = 'online') or
     (from_state = 'offline' and to_state = 'online'))
    and occurred_at at time zone 'America/New_york' > '2016-01-01'
)
select week, avg(session), id
from sessions
group by 1,3;

我可以将平均值汇总成单个值,而不是按成员,但我所写的显然是错误的,因为少数平均值返回负值。有人有什么建议吗?

你基本上对从
离线->在线到回到
?->离线之间的时间段感兴趣。因此,诀窍是在子查询中只获取这些记录,然后对这两个记录进行延迟。您的代码在这两个问题上存在一些问题,请参见下面的代码。在主查询中,您将得到平均值,并抛出
离线->在线

SELECT date_trunc('week', logout) AS week,
       avg(extract(epoch from logout - login)),  -- in seconds
       id
FROM (
  SELECT lag(occurred_at) OVER (PARTITION BY id ORDER BY occurred_at) AS login,
         occurred_at AS logout,
         id,
         to_state
  FROM state_change
  WHERE (from_state = 'offline' or to_state = 'offline')
    AND occurred_at > '2016-01-01') sub
WHERE to_state = 'offline'
GROUP BY 1,3;

大家好,欢迎来到SO!如果这回答了您的问题,那么您应该通过单击左侧的灰色复选标记来接受。您也可以使用数字上方和下方的箭头进行投票。这就是网站的工作方式,它会给其他有类似问题的用户带来好的答案。