Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL за определяне на минимални последователни дни на достъп?

Какво ще кажете (и моля, уверете се, че предишният израз завършва с точка и запетая):

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  

Идеята е, че ако имаме списък с дните (като число) и номер на ред, тогава пропуснатите дни правят отместването между тези два списъка малко по-голямо. Така че търсим диапазон, който има последователно отместване.

Можете да използвате „ORDER BY NumConsecutiveDays DESC“ в края на това или да кажете „HAVING count(*)> 14“ за праг...

Не съм тествал това обаче - просто го написах от главата си. Надяваме се, че работи в SQL2005 и след него.

... и ще бъде много подпомогнато от индекс на tablename(UserID, CreationDate)

Редактирано:Оказа се, че Offset е запазена дума, така че вместо това използвах TheOffset.

Редактирано:Предложението да се използва COUNT(*) е много валидно - трябваше да го направя на първо място, но не мислех наистина. Преди това използваше datediff(day, min(CreationDate), max(CreationDate)) вместо това.

Роб



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server - Редът на колоните има ли значение?

  2. Използвайте OBJECTPROPERTY(), за да определите дали даден обект е изглед в SQL Server

  3. Как мога да предотвратя нарастването на журнала в SQL Server, когато вмъквам милиони записи

  4. Нова версия:Spotlight Tuning Pack 7.1.9

  5. Зареждане на SQL Express от WiX?