我正在处理具有随时间回收的会话 ID 值的数据(确切地说是来自 IIS 的 asp 会话 ID)。
我试图给他们一个序列,这样 ASP_SESSION_ID 的每个实例就不会组合在一起。
例如,数据看起来像这样。相同的会话 ID,在 2016 年 8 月使用,然后在 2017 年 3 月再次使用。
DTTM SESSION_ID
2016-08-29 14:24:28.450 297692378
2017-04-13 23:54:53.760 297692378
2017-04-13 23:59:53.477 297692378
2017-04-14 00:04:52.897 297692378
2017-04-14 00:04:53.790 297692378
起初我想只按日期分组(在 DAY 级别),但对于上面的示例,请注意会话 ID 的第二个实例是如何跨越午夜的。这将导致第三组,而实际上是同一个会话。
因此,如果我能正确地对它们进行排名,那将是:
DTTM SESSION_ID RANK
2016-08-29 14:24:28.450 297692378 1
2017-04-13 23:54:53.760 297692378 2
2017-04-13 23:59:53.477 297692378 2
2017-04-14 00:04:52.897 297692378 2
2017-04-14 00:04:53.790 297692378 2
此处,当自上次请求以来超过 20 分钟后,ASP_SESSION_ID 应被视为会话的新实例。
那么,随着时间的推移,我如何对相同的 ASP_SESSION_ID 进行分组或对其进行不同的排名?例如,如果该 ASP_SESSION_ID 的下一个请求距离上一个请求 > 20 分钟,则将其分组/排名不同?
我只是不确定如何解决这个问题。
以下是生成上述数据的一些语句:
CREATE TABLE #TEST
(
DTTM DATETIME,
SESSION_ID INT
)
INSERT INTO #TEST (DTTM, SESSION_ID)
select '2016-08-29 14:24:28.450', 297692378 union
select '2017-04-13 23:54:53.760', 297692378 union
select '2017-04-13 23:59:53.477', 297692378 union
select '2017-04-14 00:04:52.897', 297692378 union
select '2017-04-14 00:04:53.790', 297692378
首先,我添加了一条新记录,只是为了检查它是否运行了 20 多分钟。
然后我添加了一个名为
RANK
存储最终结果的新列。我使用 LAG() 窗口函数来计算当前行和下一行之间的 DATEDIFF。
然后我使用了一个 CURSOR 来计算 RANK 字段。基本上它会在记录之间累积分钟数,直到达到 20 分钟或更长时间。
dbfiddle在这里