Sql 为与用户ID匹配的上一条记录自引用表

Sql 为与用户ID匹配的上一条记录自引用表,sql,sql-server,date,join,window-functions,Sql,Sql Server,Date,Join,Window Functions,我试图找到从SQL数据计算周期时间的最简单方法。在数据源中,我有唯一的站点ID、用户ID和日期/时间戳,以及它们正在执行的其他数据 我要做的是将表本身连接起来,以便为每个日期/时间戳获得: -该用户ID的上一个最新实例在3分钟内的日期/时间戳,或为空 -这两个戳记之间的差值表示循环时间=记录之间的时间量 这应该很简单,但我不能把我的大脑围绕着它。有什么帮助吗?不幸的是,SQL Server不支持窗口函数中的日期范围规范。我建议在此处进行横向连接: select t.*, t1

我试图找到从SQL数据计算周期时间的最简单方法。在数据源中,我有唯一的站点ID、用户ID和日期/时间戳,以及它们正在执行的其他数据

我要做的是将表本身连接起来,以便为每个日期/时间戳获得: -该用户ID的上一个最新实例在3分钟内的日期/时间戳,或为空 -这两个戳记之间的差值表示循环时间=记录之间的时间量


这应该很简单,但我不能把我的大脑围绕着它。有什么帮助吗?

不幸的是,SQL Server不支持窗口函数中的日期范围规范。我建议在此处进行横向连接:

select 
    t.*, 
    t1.timestamp last_timestamp, 
    datediff(second, t1.timestamp, t.timestamp) diff_seconds
from mytable t
outer apply (
    select top(1) t1.*
    from mytable t1
    where 
        t1.user_id = t.user_id 
        and t1.timestamp >= dateadd(minute, -3, t.timestamp)
        and t1.timestamp < t.timestamp
    order by t1.timestamp desc
) t1

如果在该时间段内没有行,则子查询将在3分钟内为同一用户id或空结果集带来最近的行。然后,您可以在外部查询中使用该信息来显示相应的时间戳,并计算与当前时间戳的差异。

只需计算当前时间戳和滞后时间戳的差异,如果超过三分钟,则返回NULL:

with cte as
 (
   select 
      t.*
     ,datediff(second, timestamp, lag(timestamp) over (partition by user_id order by timestamp) as diff_seconds
   from mytable as t
 )
select cte.*
  ,case when diff_seconds <= 180 then diff_seconds end
from cte

样本数据、期望的结果以及你所说的周期时间都会有所帮助。@GordonLinoff周期时间澄清。我会提供样本数据,但这是保密协议。我想GMB明白了,顺便说一句,如果GMB的查询返回正确的结果,我的查询也会这样做,而且可能更有效:-@dnoeth我确实尝试过你的查询,但我让它运行了大约5分钟,它没有给出响应,甚至没有给出部分行。好吧,奇怪。那张桌子有多大?外部应用版本的速度有多快?