Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL per determinare i giorni sequenziali minimi di accesso?

Che ne dici (e assicurati che l'istruzione precedente finisse con un punto e virgola):

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  

L'idea è che se abbiamo un elenco dei giorni (come numero) e un numero_riga, i giorni persi aumentano leggermente l'offset tra questi due elenchi. Quindi stiamo cercando un intervallo che abbia un offset coerente.

Puoi usare "ORDER BY NumConsecutiveDays DESC" alla fine di questo, o dire "HAVING count(*)> 14" per una soglia...

Non l'ho testato però, l'ho solo scritto dalla parte superiore della mia testa. Si spera che funzioni in SQL2005 e oltre.

...e sarebbe molto aiutato da un indice su tablename(UserID, CreationDate)

Modificato:risulta che Offset è una parola riservata, quindi ho usato TheOffset invece.

Modificato:il suggerimento di utilizzare COUNT(*) è molto valido:avrei dovuto farlo in primo luogo ma non stavo davvero pensando. In precedenza utilizzava datediff(day, min(CreationDate), max(CreationDate)).

Rob