Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL pour déterminer le nombre minimum de jours d'accès séquentiel ?

Que diriez-vous (et assurez-vous que la déclaration précédente se termine par un point-virgule) :

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'idée étant que si nous avons la liste des jours (sous forme de nombre) et un row_number, les jours manqués augmentent légèrement le décalage entre ces deux listes. Nous recherchons donc une plage qui a un décalage cohérent.

Vous pouvez utiliser "ORDER BY NumConsecutiveDays DESC" à la fin, ou dire "HAVING count(*)> 14" pour un seuil...

Je n'ai pas testé cela cependant - je l'écris simplement du haut de ma tête. Espérons que cela fonctionne dans SQL2005 et sur.

...et serait très aidé par un index sur tablename(UserID, CreationDate)

Modifié :il s'avère que Offset est un mot réservé, j'ai donc utilisé TheOffset à la place.

Edité :la suggestion d'utiliser COUNT (*) est très valable - j'aurais dû le faire en premier lieu, mais je n'y pensais pas vraiment. Auparavant, il utilisait datediff(day, min(CreationDate), max(CreationDate)) à la place.

Rob