Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL para determinar dias sequenciais mínimos de acesso?


Que tal (e certifique-se de que a declaração anterior terminou com um ponto e vírgula):
WITH numberedrows
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY UserID 
                                       ORDER BY CreationDate)
                - DATEDIFF(day,'19000101',CreationDate) AS TheOffset,
                CreationDate,
                UserID
         FROM   tablename)
SELECT MIN(CreationDate),
       MAX(CreationDate),
       COUNT(*) AS NumConsecutiveDays,
       UserID
FROM   numberedrows
GROUP  BY UserID,
          TheOffset  

A ideia é que, se tivermos uma lista dos dias (como um número) e um número_linha, os dias perdidos tornam o deslocamento entre essas duas listas um pouco maior. Então, estamos procurando um intervalo que tenha um deslocamento consistente.

Você pode usar "ORDER BY NumConsecutiveDays DESC" no final disso, ou dizer "HAVING count(*)> 14" para um limite...

Eu não testei isso, porém - apenas escrevendo em cima da minha cabeça. Espero que funcione no SQL2005 e em diante.

... e seria muito ajudado por um índice em tablename (UserID, CreationDate)

Editado:Acontece que Offset é uma palavra reservada, então usei TheOffset.

Editado:A sugestão de usar COUNT(*) é muito válida - eu deveria ter feito isso em primeiro lugar, mas não estava realmente pensando. Anteriormente, estava usando dateiff(day, min(CreationDate), max(CreationDate)).

Roubar