Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एसक्यूएल पहुंच के न्यूनतम अनुक्रमिक दिनों का निर्धारण करने के लिए?

कैसे के बारे में (और कृपया सुनिश्चित करें कि पिछला कथन अर्ध-बृहदान्त्र के साथ समाप्त हुआ है):

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)) का उपयोग कर रहा था।

रोब



  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 सर्वर में आपातकालीन मोड से डेटाबेस पुनर्प्राप्त करें

  2. फास्ट अपरर्ट Sql सर्वर 2008 R2

  3. SQL में प्रति समूह एक वृद्धिशील समूह संख्या कैसे वापस करें

  4. SQL तालिका को क्वेरी कैसे करें और परिणाम सेट से डुप्लिकेट पंक्तियों को कैसे निकालें

  5. SMO ConnectionContext.StatementTimeout सेटिंग पर ध्यान नहीं दिया जाता है