Estou trabalhando com dados que têm um valor de id de sessão que é reciclado ao longo do tempo (ids de sessão asp do IIS para ser exato).
Estou tentando dar a eles uma sequência para que cada instância de um ASP_SESSION_ID não seja agrupada.
Por exemplo, os dados ficariam assim. Mesma ID de sessão, usada em agosto de 2016 e novamente em março de 2017.
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
A princípio, pensei em agrupar apenas na data (no nível DAY), mas para o exemplo acima, observe como a segunda instância do ID da sessão abrange a meia-noite. Isso causaria um 3º grupo, quando na verdade é a mesma sessão.
Então, se eu pudesse classificá-los corretamente, seria:
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
Aqui, ASP_SESSION_ID deve ser considerado uma nova instância de uma sessão quando > 20 minutos se passaram desde a última solicitação.
Então, como posso agrupar ou classificar o mesmo ASP_SESSION_ID de maneira diferente à medida que eles são reutilizados ao longo do tempo? por exemplo, se a próxima solicitação desse ASP_SESSION_ID for > 20 minutos da última, agrupe-a/classifique-a de forma diferente?
Só não sei como atacar o problema.
Aqui estão algumas declarações para gerar os dados acima:
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
Primeiro, adicionei um novo registro apenas para verificar se ele dura mais de 20 minutos.
Então eu adicionei uma nova coluna chamada
RANK
para armazenar o resultado final.Eu usei a função de janela LAG() para calcular DATEDIFF entre a linha atual e a próxima.
Então eu usei um CURSOR apenas para calcular o campo RANK. Basicamente ele acumula minutos entre os registros, até atingir 20 ou mais minutos.
dbfiddle aqui