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

SQL til at bestemme minimum sekventielle dages adgang?

Hvad med (og sørg venligst for, at den forrige erklæring endte med et 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  

Ideen er, at hvis vi har en liste over dagene (som et tal) og et rækkenummer, så vil mistede dage gøre forskydningen mellem disse to lister lidt større. Så vi leder efter en rækkevidde, der har en konsekvent offset.

Du kan bruge "ORDER BY NumConsecutiveDays DESC" i slutningen af ​​dette, eller sige "HAVING count(*)> 14" for en tærskel...

Jeg har dog ikke testet dette - jeg har bare skrevet det fra toppen af ​​mit hoved. Virker forhåbentlig i SQL2005 og videre.

...og ville være meget hjulpet af et indeks på tabelnavn(BrugerID, CreationDate)

Redigeret:Det viser sig, at Offset er et reserveret ord, så jeg brugte TheOffset i stedet.

Redigeret:Forslaget om at bruge COUNT(*) er meget gyldigt - jeg skulle have gjort det i første omgang, men tænkte egentlig ikke. Tidligere brugte den datediff(dag, min(CreationDate), max(CreationDate)) i stedet.

Rob



  1. Undslipper kolon-tegnet ':' i JPA-forespørgsler

  2. mysql indsæt kun hvis ikke eksisterer virker ikke

  3. Implementering af Postgres SQL i Apache Airflow

  4. Grundlæggende MySQL-forespørgsler