首页 > 解决方案 > 通过连接获取两个值之间的时间

问题描述

我的数据库示例:

ID     APP     USER_ID    SESSION_ID  LOCAL_TIME  CONTEXT  ACTION       VALUE
141    App1    userID1     session1   2019-07-18   Player   Name      PlayerName1
141    App1    userID1     session1   2019-07-18   Player    XP          486
141    App1    userID1     session2   2019-07-18   App     BuildNum     11184
452    App1    userID4     session1   2019-07-18   Player   Name      PlayerName2
452    App1    userID4     session1   2019-07-18   State    Start     PlayerName2
452    App1    userID4     session1   2019-07-18   State    End       PlayerName2

我想做的是找到Context = state,action = endContext = state,之间的总action = start时间SESSION_ID

我需要寻找第action = end一个的原因是因为只有在他们留在比赛结束时才会记录 end 。

我遇到的问题是这两个值是相同的上下文和动作实体的一部分,我对 EAV DB 不是很好。

所需数据示例:

SESSION_ID     Play Length of session (Time between action=start & action=End
          23                 32
         215                 16
         352                 51

感谢您提供的所有帮助,我非常感谢,我希望这已经足够清楚了。小心。

标签: sqlpostgresql

解决方案


请尝试以下查询。它使用max()带有过滤器的 来确定要从带有actionof的记录中减去什么End

with playtimes as (
  select session_id, 
         case
           when action = 'End' 
             then local_time - max(local_time) 
               filter (where action = 'Start')
                 over (partition by session_id
                           order by local_time)
           else null
         end as session_length         
    from your_table
   where context = 'State'
     and action in ('Start', 'End')
   group by session_id
)
select session_length, 
       round(extract(epoch from session_length) / 60) as session_minutes
  from playtimes
 where session_length is not null;

推荐阅读