Se tivermos uma tabela no SQL Server com os seguintes dados:
ID Log_Time
1110 2016-10-31 20:34:50.000
1110 2016-10-31 20:34:58.000
1110 2016-10-31 20:35:03.000
1110 2016-11-01 01:28:29.000
1110 2016-11-01 01:28:33.000
1110 2016-11-01 01:28:37.000
1110 2016-11-01 01:28:42.000
1110 2016-11-01 01:28:46.000
1110 2016-11-01 01:28:50.000
1110 2016-11-01 01:28:54.000
1110 2016-11-01 01:28:59.000
1110 2016-11-01 01:29:03.000
Digamos que cada ação do usuário gere uma entrada log_time. A empresa calcula o número de sessões para fins de cobrança como este - comece com a sessão 1 e, para cada atividade de registro, se a diferença de horário for superior a uma hora, incremente a contagem da sessão em 1.
Esta é uma tabela bastante grande com diferentes IDs de usuário. Eu tentei uma combinação de cursores para percorrer usuários distintos e WHILE LOOPS para incrementar fazendo a sessão conta iterando linha por linha. Leva muito tempo para ser concluído e, quando essa tabela cresce, essa pode nem ser a abordagem correta. Deve haver uma maneira melhor de fazer isso. Alguma indicação?
O conjunto de resultados que preciso é este:
ID SessionCount
1110 28
1145 42
1116 38
Você deve usar a
LAG()
função para comparar valores com a linha anterior. Poderia ser implementado assim:Você também pode adicionar
1900-01-01
(ou um timestamp antigo semelhante) como o valor padrão para LAG:LAG(Log_Time, 1, '19000101')
e se livrar doOr PreviousTime Is Null
naIIF
condição.