首页 > 解决方案 > 自引用表以匹配用户 ID 的先前记录

问题描述

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

我想要做的是将表连接到自身,以便对于每个日期/时间戳,我得到: - 在 3 分钟内该用户 ID 的最近一个实例的日期/时间戳或 null - 这两个时间戳之间的差异(周期时间=记录之间的时间量)

这应该很简单,但我无法绕开它。有什么帮助吗?

标签: sqlsql-serverdatejoinwindow-functions

解决方案


不幸的是,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 分钟内为同一行带来最新的行user_id(或空结果集,如果在该时间范围内没有行)。然后,您可以在外部查询中使用该信息来显示相应的timestamp,并计算与当前查询的差异。


推荐阅读