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

sql सर्वर में विंडो मूविंग एवरेज

हार्डकोडेड दिनांक सीमा को अपनी क्वेरी से बाहर निकालें। एक अस्थायी तालिका में आउटपुट (जैसे अंत में आपका नमूना) लिखें (मैंने इसे #visits कहा है)।
इसे स्वयं अस्थायी तालिका में शामिल करने का प्रयास करें:

 Select list.dtadmission
   , AVG(data.nvisits) as Avg
   , SUM(data.nvisits) as sum
   , COUNT(data.nvisits) as RollingDayCount
   , MIN(data.dtadmission) as Verifymindate
   , MAX(data.dtadmission)   as Verifymaxdate
 from  #visits as list 
 inner join #visits as data  
 on list.dtadmission between data.dtadmission and DATEADD(DD,6,data.dtadmission) group by list.dtadmission

संपादित करें: आपके प्रश्न के उत्तर में यह कहने के लिए मेरे पास टिप्पणियों में पर्याप्त जगह नहीं थी:

मेरा शामिल होना "थोड़े कार्टेशियन" है क्योंकि यह शामिल होने में बाधा के बीच का उपयोग करता है। सूची में प्रत्येक रिकॉर्ड हर दूसरे रिकॉर्ड के खिलाफ जा रहा है, और फिर मैं उन लोगों को चाहता हूं जहां मैं रिपोर्ट करने की तारीख (-7) दिनों और आज की निचली सीमा के बीच हूं। प्रत्येक डेटा दिनांक सूची दिनांक के लिए उपलब्ध है, यह आपके प्रश्न की कुंजी है। मैं शामिल होने की शर्त को

. के रूप में लिख सकता था DATEADD(DD,-6,data.dtadmission) और data.dtadmission के बीच
list.dtadmission between DATEADD(DD,6,data.dtadmission) and data.dtadmission

लेकिन वास्तव में क्या हुआ था मैंने इसका परीक्षण

. के रूप में किया था DATEADD(DD,6,data.dtadmission) और data.dtadmission के बीच
list.dtadmission between DATEADD(DD,6,data.dtadmission) and data.dtadmission

जो कोई रिकॉर्ड नहीं देता है क्योंकि वाक्यविन्यास "कम और उच्च के बीच" है। मैंने 0 रिकॉर्ड्स का सामना किया और तर्कों की अदला-बदली की, बस।

निम्नलिखित का प्रयास करें, देखें कि मेरा क्या मतलब है:यह सिर्फ एक सूची के लिए कार्टेशियन शामिल है:

 SELECT 
 list.[dtAdmission] as listdate
 ,data.[dtAdmission] as datadate
 ,data.nVisits as datadata
 ,DATEADD(dd,6,list.dtadmission) as listplus6 
 ,DATEADD(dd,6,data.dtAdmission ) as datapplus6 
 from  [sandbox].[dbo].[admAvg] as list inner join [sandbox].[dbo].[admAvg] as data    
 on 
 1=1
 where list.dtAdmission = '5-Jan-2011'

इसकी तुलना वास्तविक जॉइन कंडीशन से करें

 SELECT 
      list.[dtAdmission] as listdate
      ,data.[dtAdmission] as datadate
      ,data.nVisits as datadata
      ,DATEADD(dd,6,list.dtadmission) as listplus6 
      ,DATEADD(dd,6,data.dtAdmission ) as datapplus6
from  [sandbox].[dbo].[admAvg] as list   inner join [sandbox].[dbo].[admAvg] as data    
on 
list.dtadmission between data.dtadmission and DATEADD(DD,6,data.dtadmission)
where list.dtAdmission = '5-Jan-2011'

सभी अभिलेखों में देखें कि डेटाडेट और डेटाप्लस 6 के बीच सूची की तारीख कैसी है?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. गणना (*) शून्य लौटाता है

  2. दो तिथियों के बीच सप्ताह प्रारंभ तिथि (सोमवार) और समाप्ति तिथि (रविवार) की सूची कैसे प्राप्त करें?

  3. बाद में मूल्यांकन किए जाने वाले डेटाबेस में सूत्र (समीकरण) का भंडारण (एसक्यूएल सर्वर 2005)

  4. त्रुटि:कॉलम DOB का प्रकार UNPIVOT सूची में निर्दिष्ट अन्य कॉलम के प्रकार के साथ विरोध करता है

  5. SQL सामान्य स्थिति संकेतन का उपयोग करने के लाभ?