Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL zum Bestimmen der minimalen aufeinanderfolgenden Tage des Zugriffs?

Wie wäre es mit (und stellen Sie bitte sicher, dass die vorherige Anweisung mit einem Semikolon endete):

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  

Die Idee ist, dass, wenn wir eine Liste der Tage (als Zahl) und eine row_number haben, dann verpasste Tage den Versatz zwischen diesen beiden Listen etwas größer machen. Also suchen wir nach einem Bereich, der einen konsistenten Offset hat.

Sie könnten am Ende "ORDER BY NumConsecutiveDays DESC" verwenden oder als Schwellenwert "HAVING count(*)> 14" sagen...

Ich habe das aber nicht getestet - ich schreibe es nur von der Spitze meines Kopfes. Funktioniert hoffentlich in SQL2005 und höher.

...und würde sehr durch einen Index auf Tabellenname (UserID, CreationDate) helfen

Bearbeitet:Stellt sich heraus, dass Offset ein reserviertes Wort ist, also habe ich stattdessen TheOffset verwendet.

Bearbeitet:Der Vorschlag, COUNT(*) zu verwenden, ist sehr gültig - ich hätte das zuerst tun sollen, habe aber nicht wirklich nachgedacht. Zuvor wurde stattdessen datediff(day, min(CreationDate), max(CreationDate)) verwendet.

Rob