sql >> Databáze >  >> RDS >> Sqlserver

SQL určit minimální sekvenční dny přístupu?

Co takhle (a ujistěte se, že předchozí příkaz končil středníkem):

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  

Myšlenka je taková, že pokud máme seznam dnů (jako číslo) a row_number, pak zmeškané dny dělají posun mezi těmito dvěma seznamy o něco větší. Takže hledáme rozsah, který má konzistentní offset.

Můžete použít "ORDER BY NumConsecutiveDays DESC" na konci tohoto, nebo říci "HAVING count(*)> 14" pro prahovou hodnotu...

To jsem ale netestoval - jen to píšu z hlavy. Doufejme, že funguje v SQL2005 a dále.

...a velmi by nám pomohl index na tablename(UserID, CreationDate)

Upraveno:Ukázalo se, že Offset je vyhrazené slovo, takže jsem místo toho použil TheOffset.

Upraveno:Návrh použít COUNT(*) je velmi platný - měl jsem to udělat na prvním místě, ale ve skutečnosti jsem nepřemýšlel. Dříve se místo toho používal datediff(den, min(Datum vytvoření), max(Datum vytvoření)).

Rob



  1. MySQL:Získejte návratový výsledek z INSERT SELECT

  2. MYSQL Přidejte pracovní dny k dnešnímu dni

  3. MySQL User Defined Function pro odeslání zprávy systému Windows

  4. Příklady LOG() v SQL Server