Sql 定义会话时不仅要有时间限制

Sql 定义会话时不仅要有时间限制,sql,Sql,我一直在尝试将表用户、操作、事件时间等事件分组到会话中 但普通的空闲时间方法是不够的 我需要检查用户空闲时间是否超过一段时间,好的,但是如果用户开始游戏,那么它很可能会空闲很长时间,并且在开始游戏和结束游戏之间的每个动作,无论时间间隔如何,都不应被视为新的会话。但当游戏结束时,会出现一个新的会话: 例如,怠速时间为5分钟 | action | user | event_at | new_session? (desired output) | |---------------

我一直在尝试将表用户、操作、事件时间等事件分组到会话中

但普通的空闲时间方法是不够的

我需要检查用户空闲时间是否超过一段时间,好的,但是如果用户开始游戏,那么它很可能会空闲很长时间,并且在开始游戏和结束游戏之间的每个动作,无论时间间隔如何,都不应被视为新的会话。但当游戏结束时,会出现一个新的会话:

例如,怠速时间为5分钟

| action | user | event_at | new_session? (desired output) | |---------------|------|--------------|-------------------------------| | random1 | 1 | 1 sec | 1 | | random3 | 1 | 30 sec | 0 | | random4 | 1 | 6:00 min | 1 | | random5 | 1 | 7:00 min | 0 | | game_started | 1 | 7:30 min | 0 | | random2 | 1 | 20:00 min | 0 | | random5 | 1 | 27:00 min | 0 | | game_finished | 1 | 35:00 min | 0 | | random5 | 1 | 35:30 min | 1 | 问题在于游戏开始和结束之间的随机动作。在使用空闲时间逻辑时,我不能告诉SQL忽略它们,也不能将它们作为新会话来计算——这对于不是在开始和完成之间的部分是必需的

在正确的编程语言中,我可以在for或while finds游戏开始后添加一个标志,并告诉它忽略任何内容,直到找到游戏_finished。但在SQL中,即使使用辅助列,这也不是那么容易

有什么想法吗? 提前谢谢

首先确定游戏,然后使用lag启动会话:

  select t.*,
         (case when in_game > 0 and
                    (lag(in_game) over (order by time) is null or
                     lag(in_game) over (order by time) = 0
                    )
               then 1
               when in_game = 0 and
                    (lag(time) over (partition by in_game order by time) is null or
                     lag(time) over (partition by in_game order by time) < time - interval '5 minute'
                    )
               then 1
               else 0
           end) as new_session
  from (select t.*,
               sum(case when action = 'game_start' then 1
                        when action = 'game_end' then -1
                   end) over (order by time) as in_game
        from t
       ) t;

这并不能处理所有边缘情况。例如,此版本不处理嵌套游戏。这也可能是棘手的游戏紧挨着对方。但我认为它确实满足了您的要求。

您应该显示您当前的查询。嗨,戈登,这已经给了我一些启示。非常感谢。现在我要处理例外情况。例如,由于表是一个日期时间间隔的快照,我可能已经完成了游戏,但没有开始它,这将给我-1结果。。。或者可能有一个错误,游戏开始两次,但只有一个游戏结束,但任何游戏结束都应该重置计数器,但我真诚地认为SQL不是处理这些问题的合适编程语言problems@maria_saiz . . . 这是可能的。我建议您提出另一个问题,提供更合适的样本数据和期望的结果。事实上,只可能回答你提出的问题,而你的数据比这个问题所暗示的要混乱一些。