SORU
24 Temmuz 2009, Cuma


Erişim en az ardışık gün belirlemek için SQL?

Aşağıdaki Kullanıcı Geçmiş tablo içerirher gün için bir kayıt belirli bir kullanıcının bir web sitesine giriş yaptı(24 saat UTC bir dönemde). Kayıtları, ancak kullanıcı başına günde sadece bir kayıt binlerce vardır. Eğer kullanıcı o gün için siteye erişilen varsa, herhangi bir kayıt oluşturulur.

Id      UserId   CreationDate
------  ------   ------------
750997      12   2009-07-07 18:42:20.723
750998      15   2009-07-07 18:42:20.927
751000      19   2009-07-07 18:42:22.283

Aradığım şey bu masanın üzerinde bir SQL sorgusuiyi bir performans ilebu userids bir gün eksik olmadan (n) sürekli gün için siteye girmiş, hangi söyledi.

Diğer bir deyişle,kaç kullanıcı (n) sıralı (bir gün önce veya bir gün sonra) bu tabloda kayıt tarihleri var? Eğer herhangi bir gün sıra yoksa, sırası bozuk ve tekrar 1; gün burada boşluk yok sürekli bir sayı elde eden kullanıcılar arıyoruz yeniden başlatma gerekir.

Bu sorgu ve a particular Stack Overflow badge arasında herhangi bir benzerlik tamamen tesadüfi, tabii ki.. :)

CEVAP
24 Temmuz 2009, Cuma


Nasıl (ve önceki deyimi bir noktalı virgül ile sona erdi emin olun lütfen

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  

Fikir ise listenin gün (sayı olarak) eğer bu varlık ve row_number, sonra cevapsız bir gün bu iki liste arasındaki uzaklık biraz daha büyük olun. Tutarlı bir mahsup hesabı olan bir dizi arıyoruz.

"NumConsecutiveDays TARAFINDAN SİPARİŞ AZA" bu sonunda, "count(*) >OLMASI kullanabilirsin 14" için bir eşik...

Bu gerçi sadece kafamın üst kapalı yazılı test etmedim. Umarım SQL2005 ve üzerinde çalışıyor.

...ve çok fazla olurdu yardımcı tablename dizin) (kullanıcı Kimliği, CreationDate

Düzenlenmiştir: meğer Ofset ayrılmış bir sözcüktür, TheOffset yerine kullandım.

Düzenlenmiştir: SAYISI çok geçerli kullanımı öneri - en başta yapmam gerekirdi ama gerçekten düşünce değildi. Daha önce bunun yerine kapsamı gün, min(CreationDate), max(CreationDate)) kullanıyordu.

Rob

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • michellefeng's channel

    michellefeng

    26 Kasım 2006
  • Paste Magazine

    Paste Magazi

    28 AĞUSTOS 2008
  • TitaniumBackup

    TitaniumBack

    10 EYLÜL 2011