Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL w celu określenia minimalnej liczby kolejnych dni dostępu?

Co powiesz na to (i upewnij się, że poprzednie stwierdzenie zakończyło się średnikiem):

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  

Chodzi o to, że jeśli mamy listę dni (jako liczbę) i numer_wiersza, to pominięte dni sprawiają, że przesunięcie między tymi dwiema listami jest nieco większe. Dlatego szukamy zakresu, który ma spójne przesunięcie.

Możesz użyć „ORDER BY NumConsecutiveDays DESC” na końcu tego lub powiedzieć „HAVING count(*)> 14” jako próg...

Nie testowałem tego jednak - po prostu spisywałem to z czubka głowy. Mam nadzieję, że działa w SQL2005 i później.

...i bardzo pomógłby indeks na tablename (UserID, CreationDate)

Edytowane:Okazuje się, że Offset jest słowem zastrzeżonym, więc zamiast tego użyłem TheOffset.

Edytowane:Sugestia użycia COUNT(*) jest bardzo słuszna - powinienem był to zrobić, ale tak naprawdę nie myślałem. Wcześniej używał datediff(dzień, min(CreationDate), max(CreationDate)) zamiast tego.

Okraść



  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 Express do produkcji?

  2. Wyłącz dziennik transakcji

  3. Jak utworzyć widok w SQL Server

  4. Coldfusion:Radzenie sobie z wartościami Null w polu daty

  5. Zaktualizuj pole istniejącej tabeli za pomocą logiki Auto Increment