sql >> Databasteknik >  >> RDS >> Sqlserver

SQL för att bestämma minsta antal dagars åtkomst i följd?

Vad sägs om (och se till att föregående påstående slutade med semikolon):

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  

Tanken är att om vi har en lista över dagar (som ett nummer) och ett radnummer, så gör missade dagar förskjutningen mellan dessa två listor något större. Så vi letar efter ett intervall som har en konsekvent offset.

Du kan använda "ORDER BY NumConsecutiveDays DESC" i slutet av detta, eller säga "HAVING count(*)> 14" för en tröskel...

Jag har dock inte testat det här - jag har bara skrivit av det på huvudet. Fungerar förhoppningsvis i SQL2005 och vidare.

...och skulle vara mycket hjälpt av ett index på tabellnamn(användar-ID, skapandedatum)

Redigerat:Det visade sig att Offset är ett reserverat ord, så jag använde TheOffset istället.

Redigerat:Förslaget att använda COUNT(*) är mycket giltigt - jag borde ha gjort det från början men tänkte inte riktigt. Tidigare använde den datediff(day, min(CreationDate), max(CreationDate)) istället.

Rob



  1. Hur LEAST() fungerar i MariaDB

  2. Använder Workbench för att ansluta till Remote MySQL Server via SSH Tunnel

  3. Redundanta data i uppdateringsutlåtanden

  4. Använder id som är kommaseparerad sql