sql >> Database >  >> RDS >> Sqlserver

SQL om het minimum aantal opeenvolgende dagen van toegang te bepalen?

Wat dacht je van (en zorg ervoor dat de vorige verklaring eindigde met een puntkomma):

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  

Het idee is dat als we een lijst met dagen (als een getal) en een rij_nummer hebben, de gemiste dagen de afwijking tussen deze twee lijsten iets groter maken. We zijn dus op zoek naar een bereik met een consistente offset.

U kunt aan het einde hiervan "ORDER BY NumConsecutiveDays DESC" gebruiken, of "HAVING count(*)> 14" zeggen voor een drempel...

Ik heb dit echter niet getest - ik schrijf het gewoon uit mijn hoofd. Hopelijk werkt het in SQL2005 en later.

...en zou zeer geholpen worden door een index op tablename(UserID, CreationDate)

Bewerkt:het blijkt dat Offset een gereserveerd woord is, dus ik heb in plaats daarvan TheOffset gebruikt.

Bewerkt:de suggestie om COUNT(*) te gebruiken is zeer geldig - ik had dat in de eerste plaats moeten doen, maar dacht niet echt na. Voorheen gebruikte het in plaats daarvan datediff(day, min(CreationDate), max(CreationDate)).

Rob



  1. 3 Methoden om MDF-bestanden te verbinden met SQL Server

  2. Alle controlebeperkingen in SQL Server-database inschakelen - SQL Server / TSQL-zelfstudie deel 88

  3. Laravel-tijdstempel wordt bijgewerkt zonder expliciete oproep om dit te doen

  4. Hoe de Postgres-functie aan te roepen die een SETOF-record retourneert?