sql >> Base de Datos >  >> RDS >> Sqlserver

SQL para determinar el mínimo de días secuenciales de acceso?

¿Qué tal (y asegúrese de que la declaración anterior terminó con un punto y coma):

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  

La idea es que si tenemos una lista de los días (como un número) y un número_de_fila, entonces los días perdidos hacen que el desplazamiento entre estas dos listas sea un poco más grande. Por lo tanto, estamos buscando un rango que tenga una compensación constante.

Podría usar "ORDER BY NumConsecutiveDays DESC" al final de esto, o decir "HAVING count(*)> 14" para un umbral...

Sin embargo, no he probado esto, solo lo escribo en la parte superior de mi cabeza. Esperemos que funcione en SQL2005 y en adelante.

...y sería de gran ayuda un índice en tablename(UserID, CreationDate)

Editado:resulta que Offset es una palabra reservada, así que usé TheOffset en su lugar.

Editado:la sugerencia de usar COUNT (*) es muy válida; debería haberlo hecho en primer lugar, pero realmente no estaba pensando. Anteriormente, usaba fechadoiff(día, min(FechaDeCreación), máx(FechaDeCreación)) en su lugar.

Rob