कैसे के बारे में (और कृपया सुनिश्चित करें कि पिछला कथन अर्ध-बृहदान्त्र के साथ समाप्त हुआ है):
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" का उपयोग कर सकते हैं, या एक सीमा के लिए "हैविंग काउंट(*)> 14" कह सकते हैं...
मैंने हालांकि इसका परीक्षण नहीं किया है - बस इसे मेरे सिर के ऊपर से लिख रहा हूं। उम्मीद है कि SQL2005 और उसके बाद काम करता है।
...और टैबलेटनाम (यूजरआईडी, क्रिएशनडेट) पर एक इंडेक्स द्वारा बहुत मदद की जाएगी
संपादित:टर्न आउट ऑफ़सेट एक आरक्षित शब्द है, इसलिए मैंने इसके बजाय TheOffset का उपयोग किया।
संपादित:COUNT(*) का उपयोग करने का सुझाव बहुत मान्य है - मुझे इसे पहले स्थान पर करना चाहिए था लेकिन वास्तव में सोच नहीं रहा था। पहले यह इसके बजाय dateiff(day, min(CreationDate), max(CreationDate)) का उपयोग कर रहा था।
रोब