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

सरल से स्लाइडिंग एकत्रीकरण तक SQL में डेटा एकत्र करने की कला

आइए SQL में एकत्रित डेटा और सरल और स्लाइडिंग एकत्रीकरण सहित एकत्रीकरण के प्रकारों को समझने के लिए अपनी SQL यात्रा शुरू करें।

इससे पहले कि हम एकत्रीकरण पर जाएं, कुछ डेवलपर्स द्वारा अक्सर याद किए जाने वाले दिलचस्प तथ्यों पर विचार करना उचित है, जब सामान्य रूप से एसक्यूएल और विशेष रूप से एकत्रीकरण की बात आती है।

इस लेख में, SQL T-SQL को संदर्भित करता है जो SQL का Microsoft संस्करण है और इसमें मानक SQL की तुलना में अधिक सुविधाएँ हैं।

एसक्यूएल के पीछे का गणित

यह समझना बहुत महत्वपूर्ण है कि टी-एसक्यूएल कुछ ठोस गणित अवधारणाओं पर आधारित है, हालांकि यह कठोर गणित आधारित भाषा नहीं है।

इट्ज़िक बेन-गण द्वारा "Microsoft_SQL_Server_2008_T_SQL_Fundamentals" पुस्तक के अनुसार, SQL को एक रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) में डेटा को क्वेरी और प्रबंधित करने के लिए डिज़ाइन किया गया है।

संबंधपरक डेटाबेस प्रबंधन प्रणाली स्वयं दो ठोस गणितीय शाखाओं पर आधारित है:

  • सिद्धांत सेट करें
  • तर्क की भविष्यवाणी करें

सिद्धांत सेट करें

सेट थ्योरी, जैसा कि नाम से संकेत मिलता है, सेट के बारे में गणित की एक शाखा है जिसे निश्चित विशिष्ट वस्तुओं का संग्रह भी कहा जा सकता है।

संक्षेप में, सेट थ्योरी में, हम चीजों या वस्तुओं के बारे में उसी तरह सोचते हैं जैसे हम किसी एक वस्तु के बारे में सोचते हैं।

उदाहरण के लिए, एक पुस्तक सभी निश्चित विशिष्ट पुस्तकों का एक समूह है, इसलिए, हम एक पुस्तक को समग्र रूप से लेते हैं जो उसमें सभी पुस्तकों का विवरण प्राप्त करने के लिए पर्याप्त है।

प्रिडिकेट लॉजिक

विधेय तर्क एक बूलियन तर्क है जो चर की स्थिति या मूल्यों के आधार पर सही या गलत लौटाता है।

विधेय तर्क का उपयोग अखंडता नियमों को लागू करने के लिए किया जा सकता है (कीमत 0.00 से अधिक होनी चाहिए) या डेटा फ़िल्टर (जहां कीमत 10.00 से अधिक है), हालांकि, टी-एसक्यूएल के संदर्भ में, हमारे पास निम्नानुसार तीन तर्क मान हैं:

  1. सच
  2. झूठा
  3. अज्ञात (शून्य)

इसे इस प्रकार दर्शाया जा सकता है:

विधेय का एक उदाहरण है "जहां पुस्तक की कीमत 10.00 से अधिक है"।

गणित के बारे में इतना ही काफी है, लेकिन कृपया ध्यान रखें कि मैं इस लेख में बाद में इसका उल्लेख करने जा रहा हूं।

एसक्यूएल में डेटा एकत्र करना आसान क्यों है

SQL में डेटा को उसके सरलतम रूप में एकत्र करना एक बार में कुल योग के बारे में जानने के बारे में है।

उदाहरण के लिए, यदि हमारे पास एक ग्राहक तालिका है जिसमें सभी ग्राहकों की सूची उनके विवरण के साथ है तो ग्राहक तालिका का समेकित डेटा हमें कुल ग्राहकों की संख्या दे सकता है।

जैसा कि पहले चर्चा की गई थी, हम एक सेट को एक एकल आइटम के रूप में सोचते हैं, इसलिए हम योग प्राप्त करने के लिए तालिका में केवल एक समग्र फ़ंक्शन लागू करते हैं।

चूंकि SQL मूल रूप से एक सेट आधारित भाषा है (जैसा कि पहले चर्चा की गई है), इसलिए अन्य भाषाओं की तुलना में इसमें समग्र कार्यों को लागू करना अपेक्षाकृत आसान है।

उदाहरण के लिए, यदि हमारे पास एक उत्पाद तालिका है जिसमें डेटाबेस में सभी उत्पादों का रिकॉर्ड है तो हम उत्पादों की कुल संख्या प्राप्त करने के लिए सीधे उत्पाद तालिका में गिनती फ़ंक्शन लागू कर सकते हैं, बजाय उन्हें लूप में एक-एक करके गिनने के।

डेटा एकत्रीकरण पकाने की विधि

SQL में डेटा एकत्र करने के लिए, हमें निम्न चीज़ों की न्यूनतम आवश्यकता होती है:

  1. डेटा (तालिका) कॉलम के साथ जो एकत्रित होने पर समझ में आता है
  2. डेटा पर लागू किया जाने वाला एक समग्र कार्य

नमूना डेटा तैयार करना (तालिका)

आइए हम एक साधारण ऑर्डर टेबल का उदाहरण लेते हैं जिसमें तीन चीजें (कॉलम) होती हैं:

  1. आदेश संख्या (आदेश आईडी)
  2. आदेश देने की तिथि (आदेश दिनांक)
  3. आदेश की राशि (कुल राशि)

आइए आगे बढ़ने के लिए समग्र नमूना डेटाबेस बनाएं:

-- एग्रीगेट सैंपल डेटाबेस बनाएं DATABASE AggregateSample बनाएं

अब नमूना डेटाबेस में क्रम तालिका इस प्रकार बनाएं:

-- एग्रीगेट सैंपल डेटाबेस में ऑर्डर टेबल बनाएंयूज एग्रीगेटसैंपलक्रिएट टेबल सिंपलऑर्डर (ऑर्डरआईडी INT प्राथमिक कुंजी पहचान(1,1), ऑर्डरडेट DATETIME2, TotalAmount DECIMAL(10,2))

नमूना डेटा पॉप्युलेट करना

एक पंक्ति जोड़कर तालिका को पॉप्युलेट करें:

dbo में डालें। 

आइए अब तालिका देखें:

-- ऑर्डर टेबल देखें ऑर्डर आईडी, ऑर्डरडेट, सिंपलऑर्डर से टोटलअमाउंट चुनें

कृपया ध्यान दें कि मैं इस लेख में SQL सर्वर के लिए dbForge Studio का उपयोग कर रहा हूं, इसलिए यदि आप SSMS (SQL सर्वर प्रबंधन स्टूडियो) में समान कोड चलाते हैं, तो केवल आउटपुट लुक भिन्न हो सकता है, जहां तक ​​​​स्क्रिप्ट और उनके परिणामों का संबंध है, कोई अंतर नहीं है।

मूल समग्र कार्य

तालिका में लागू किए जा सकने वाले मूल समग्र कार्य इस प्रकार हैं:

  1. योग
  2. गणना
  3. न्यूनतम
  4. अधिकतम
  5. औसत

एकल रिकॉर्ड तालिका एकत्रित करना

अब दिलचस्प सवाल यह है कि, "क्या हम एक तालिका में डेटा (रिकॉर्ड) एकत्र (योग या गणना) कर सकते हैं यदि हमारे मामले में केवल एक पंक्ति है?" इसका उत्तर "हां" है, हम कर सकते हैं, हालांकि इसका अधिक अर्थ नहीं है लेकिन यह हमें यह समझने में मदद कर सकता है कि डेटा एकत्रीकरण के लिए कैसे तैयार होता है।

आदेशों की कुल संख्या प्राप्त करने के लिए, हम तालिका के साथ गिनती () फ़ंक्शन का उपयोग करते हैं, जैसा कि पहले चर्चा की गई है, हम केवल तालिका में कुल फ़ंक्शन लागू कर सकते हैं क्योंकि SQL एक सेट आधारित भाषा है और संचालन को एक सेट पर लागू किया जा सकता है सीधे।

-- अब तक दिए गए आदेशों की कुल संख्या प्राप्त करना सरल आदेश से कुल_आदेश के रूप में COUNT(*) का चयन करें

अब, एक रिकॉर्ड के लिए न्यूनतम, अधिकतम और औसत राशि वाले ऑर्डर के बारे में क्या:

-- न्यूनतम राशि, अधिकतम राशि, औसत राशि और कुल ऑर्डर के साथ ऑर्डर प्राप्त करना COUNT(*) AS Total_Orders, MIN(TotalAmount) AS Min_Amount ,MAX(TotalAmount) AS Max_Amount ,AVG(TotalAmount) औसत_AmountFROM SimpleOrder

जैसा कि हम आउटपुट से देख सकते हैं, न्यूनतम, अधिकतम और औसत राशि समान है यदि हमारे पास एक रिकॉर्ड है, तो एक एकल रिकॉर्ड के लिए एक समग्र कार्य लागू करना संभव है लेकिन यह हमें वही परिणाम देता है।

एकत्रित डेटा को समझने के लिए हमें कम से कम एक से अधिक रिकॉर्ड की आवश्यकता है।

एकाधिक रिकॉर्ड तालिका एकत्रित करना

आइए अब चार और रिकॉर्ड इस प्रकार जोड़ें:

 डीबीओ में सम्मिलित करें। TotalAmount - दशमलव(10, 2)),('20180103' -- OrderDate - datetime2,10.50 -- TotalAmount - दशमलव(10, 2)),('20180110' -- OrderDate - datetime2,100.50 -- TotalAmount - दशमलव( 10, 2));जाओ

तालिका अब इस प्रकार दिखती है:

यदि हम तालिका में समग्र कार्यों को अभी लागू करते हैं, तो हमें अच्छे परिणाम मिलेंगे:

-- न्यूनतम राशि, अधिकतम राशि, औसत राशि और कुल ऑर्डर के साथ ऑर्डर प्राप्त करना COUNT(*) AS Total_Orders, MIN(TotalAmount) AS Min_Amount ,MAX(TotalAmount) AS Max_Amount ,AVG(TotalAmount) औसत_AmountFROM SimpleOrder

एकत्रित डेटा को समूहीकृत करना

हम उस कॉलम के आधार पर समुच्चय प्राप्त करने के लिए किसी भी कॉलम या कॉलम के सेट द्वारा एकत्रित डेटा को समूहित कर सकते हैं।

उदाहरण के लिए, यदि हम प्रति दिनांक आदेशों की कुल संख्या, जानना चाहते हैं, तो हमें ग्रुप बाय क्लॉज का उपयोग करके तालिका को तिथि के अनुसार समूहबद्ध करना होगा:

-- प्रति दिनांक कुल आदेश प्राप्त करना चयन आदेश दिनांक, COUNT(*) के रूप में Total_OrdersFROM SimpleOrderGROUP by OrderDate

आउटपुट इस प्रकार है:

इसलिए यदि हम सभी ऑर्डर राशि का योग देखना चाहते हैं, हम बिना किसी समूह के कुल राशि कॉलम में योग फ़ंक्शन को आसानी से लागू कर सकते हैं:

-- सभी ऑर्डर राशि का योग चुनें SUM(TotalAmount) AS Sum_of_Orders_AmountFROM SimpleOrder

प्रति दिनांक ऑर्डर राशि का योग प्राप्त करने के लिए, हम उपरोक्त SQL कथन में तिथि के अनुसार समूह को निम्नानुसार जोड़ते हैं:

--सभी ऑर्डर राशि का योग प्रति दिनांक चुनें ऑर्डर दिनांक, SUM (TotalAmount) AS Sum_of_OrdersFROM SimpleOrderGROUP BY OrderDate

डेटा को समूहीकृत किए बिना योग प्राप्त करना

अगर एकत्रीकरण सभी तालिकाओं के लिए है तो हम सीधे कुल ऑर्डर, अधिकतम ऑर्डर राशि, न्यूनतम ऑर्डर राशि, ऑर्डर राशि का योग, औसत ऑर्डर राशि को समूहबद्ध करने की आवश्यकता के बिना प्राप्त कर सकते हैं।

-- न्यूनतम राशि, अधिकतम राशि, औसत राशि, राशि का योग और कुल ऑर्डर के साथ ऑर्डर प्राप्त करना COUNT(*) AS Total_Orders, MIN(TotalAmount) AS Min_Amount ,MAX(TotalAmount) AS Max_Amount ,AVG(TotalAmount) AS औसत_राशि के साथ ऑर्डर प्राप्त करना ,SUM(TotalAmount) As Sum_of_AmountFROM SimpleOrder

ग्राहकों को ऑर्डर में जोड़ना

आइए हम अपनी तालिका में ग्राहकों को जोड़कर कुछ मज़ा जोड़ें। हम ग्राहकों की एक और तालिका बनाकर और ग्राहक आईडी को ऑर्डर तालिका में पास करके ऐसा कर सकते हैं, हालांकि इसे सरल रखने के लिए और डेटा वेयरहाउस शैली (जहां टेबल को असामान्य किया जाता है) का मजाक उड़ाने के लिए, मैं ऑर्डर तालिका में ग्राहक नाम कॉलम जोड़ रहा हूं। :

-- ऑर्डर टेबल में CustomerName कॉलम और डेटा जोड़ना। 'WHERE OrderId =3GOUPDATE SimpleOrderSET CustomerName ='Asif'WHERE OrderId =4GOUPDATE SimpleOrderSET CustomerName ='Peter'WHERE OrderId =5GO

प्रति ग्राहक कुल ऑर्डर प्राप्त करना

क्या अब आप अनुमान लगा सकते हैं कि प्रति ग्राहक कुल ऑर्डर कैसे प्राप्त करें? आपको ग्राहक (ग्राहक नाम) के आधार पर समूह बनाना होगा और सभी रिकॉर्डों पर कुल फ़ंक्शन गणना () को निम्नानुसार लागू करना होगा:

-- प्रति ग्राहक कुल ऑर्डर चुनें CustomerName,COUNT(*) AS Total_Orders by CustomerName द्वारा SimpleOrder GROUP

आदेश तालिका में पांच और रिकॉर्ड जोड़ना

अब हम साधारण क्रम तालिका में निम्नानुसार पाँच और पंक्तियाँ जोड़ने जा रहे हैं:

-- ऑर्डर टेबल में 5 और रिकॉर्ड जोड़नासरल ऑर्डर में डालें (ऑर्डरडेट, टोटलअमाउंट, कस्टमरनाम) VALUES ('01-जनवरी-2018', 70.50, 'सैम'), ('02-जनवरी-2018', 170.50, ' आदिल'), ('03-जनवरी-2018', 50.00, 'सारा'), ('04-जनवरी-2018', 50.00, 'आसिफ'), ('11-जनवरी-2018', 50.00, 'पीटर') )जाओ

अब डेटा पर एक नज़र डालें:

-- ग्राहक का नाम और पांच और पंक्तियों को जोड़ने के बाद ऑर्डर तालिका देखना ऑर्डर आईडी, ग्राहक नाम, ऑर्डर दिनांक, SimpleOrder GO से कुल राशि

अधिकतम से न्यूनतम ऑर्डर के अनुसार प्रति ग्राहक कुल ऑर्डर प्राप्त करना

यदि आप प्रति ग्राहक कुल ऑर्डर में रुचि रखते हैं जो अधिकतम से न्यूनतम ऑर्डर के अनुसार क्रमबद्ध हैं, तो इसे छोटे चरणों में तोड़ना बिल्कुल भी बुरा नहीं है:

-- (1) कुल ऑर्डर प्राप्त करना साधारण ऑर्डर से कुल_ऑर्डर के रूप में COUNT(*) चुनें

-- (2) प्रति ग्राहक कुल ऑर्डर प्राप्त करना चुनें CustomerName,COUNT(*) AS Total_Orders by CustomerName द्वारा SimpleOrderGROUP

ऑर्डर काउंट को अधिकतम से न्यूनतम तक क्रमबद्ध करने के लिए, हमें ऑर्डर बाय डीईएससी (अवरोही क्रम) क्लॉज का उपयोग अंत में काउंट () के साथ करना होगा:

-- (3) अधिकतम से न्यूनतम ऑर्डर तक प्रति ग्राहक कुल ऑर्डर प्राप्त करना चुनें CustomerName,COUNT(*) जैसा Total_Orders by CustomerNameOrder by COUNT(*) DESC

पहले सबसे हाल के आदेश के अनुसार क्रमबद्ध प्रति दिनांक कुल आदेश प्राप्त करना

उपरोक्त विधि का उपयोग करके अब हम सबसे हाल के आदेश द्वारा क्रमबद्ध प्रति दिनांक कुल ऑर्डर का पता लगा सकते हैं:

-- सबसे हाल के पहले से कुल ऑर्डर प्राप्त करना CAST(OrderDate AS DATE) के रूप में OrderDate, COUNT(*) AS Total_Orders by OrderDateORDER by OrderDate DESC

CAST फ़ंक्शन हमें केवल दिनांक भाग प्राप्त करने में मदद करता है। आउटपुट इस प्रकार है:

आप यथासंभव अधिक से अधिक संयोजनों का उपयोग तब तक कर सकते हैं जब तक वे समझ में आते हैं।

समुच्चय चलाना

अब जब हम अपने डेटा में समग्र कार्यों को लागू करने से परिचित हैं, तो आइए हम एकत्रीकरण के उन्नत रूप पर आगे बढ़ते हैं और ऐसा ही एक एकत्रीकरण चल रहा एकत्रीकरण है।

रनिंग एग्रीगेशन पूरे डेटासेट के बजाय डेटा के सबसेट पर लागू होने वाले एग्रीगेशन हैं जो हमें डेटा पर छोटी विंडो बनाने में मदद करते हैं।

अब तक हमने देखा है कि सभी कुल कार्य तालिका की सभी पंक्तियों पर लागू होते हैं जिन्हें कुछ कॉलम द्वारा समूहीकृत किया जा सकता है जैसे ऑर्डर तिथि या ग्राहक का नाम, लेकिन चल रहे एकत्रीकरण के साथ हमें पूरे समूह के बिना कुल कार्यों को लागू करने की स्वतंत्रता है डेटासेट।

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

डेटा पर विंडोज़

जैसा कि पहले कहा गया है, रनिंग एग्रीगेशन डेटासेट के सबसेट या (दूसरे शब्दों में) डेटा की छोटी विंडो पर लागू होता है।

विंडोज़ को एक सेट के भीतर एक सेट या एक टेबल के भीतर एक टेबल के रूप में सोचें। हमारे मामले में डेटा पर विंडोिंग का एक अच्छा उदाहरण है, हमारे पास ऑर्डर टेबल है जिसमें अलग-अलग तिथियों पर ऑर्डर दिए गए हैं, तो क्या होगा यदि प्रत्येक तिथि एक अलग विंडो है, तो हम प्रत्येक विंडो पर उसी तरह से कुल फ़ंक्शन लागू कर सकते हैं जैसे हमने आवेदन किया था टेबल।

यदि हम ऑर्डर तालिका (सरल ऑर्डर) को ऑर्डर तिथि (ऑर्डरडेट) के अनुसार निम्नानुसार क्रमबद्ध करते हैं:

-- ऑर्डर की तारीख के अनुसार क्रमबद्ध ऑर्डर टेबल देखें। ऑर्डर आईडी, सो। ऑर्डरडेट, सो। टोटलअमाउंट, सो। कस्टमरनाम फ्रॉम सिंपलऑर्डर सो ऑर्डर बाय सो। ऑर्डरडेट

एकत्रीकरण चलाने के लिए तैयार डेटा पर विंडोज़ को नीचे देखा जा सकता है:

हम इन विंडो या सबसेट को छह मिनी ऑर्डर दिनांक आधारित टेबल के रूप में भी मान सकते हैं और इनमें से प्रत्येक मिनी टेबल पर समुच्चय लागू किया जा सकता है।

विभाजन का उपयोग OVER() क्लॉज के अंदर

ओवर () क्लॉज के अंदर "पार्टिशन बाय" का उपयोग करके टेबल को विभाजित करके रनिंग एग्रीगेशन लागू किया जा सकता है।

उदाहरण के लिए, यदि हम ऑर्डर तालिका को तिथियों से विभाजित करना चाहते हैं जैसे कि प्रत्येक तिथि डेटासेट पर एक उप-तालिका या विंडो है, तो हमें ऑर्डर तिथि के अनुसार डेटा को विभाजित करना होगा और इसे कुल फ़ंक्शन का उपयोग करके प्राप्त किया जा सकता है जैसे कि COUNT( ) ओवर () और पार्टिशन के अंदर ओवर () के साथ निम्नानुसार है:

-- दिनांकों के अनुसार विभाजन द्वारा आदेश तालिका पर एकत्रीकरण चलाना चयन आदेश दिनांक, Total_Orders=COUNT(*) OVER(PARTITION by OrderDate) From SimpleOrder

प्रति दिनांक विंडो (विभाजन) के लिए रनिंग टोटल प्राप्त करना

रनिंग एग्रीगेशन हमें एग्रीगेशन स्कोप को केवल परिभाषित विंडो तक सीमित करने में मदद करता है और हम प्रति विंडो रनिंग टोटल इस प्रकार प्राप्त कर सकते हैं:

-- कुल ऑर्डर प्राप्त करना, न्यूनतम राशि, अधिकतम राशि, औसत राशि और सभी राशियों का प्रति दिनांक विंडो (दिनांक के अनुसार विभाजन) CAST चुनें (आदेश दिनांक के रूप में दिनांक) ऑर्डर दिनांक के रूप में, गणना =COUNT (*) ओवर (पार्टिशन द्वारा) ऑर्डरडेट), मिन_अमाउंट =मिन (कुल राशि) ओवर (ऑर्डरडेट द्वारा पार्टिशन), मैक्स_अमाउंट =मैक्स (टोटलअमाउंट) ओवर (ऑर्डरडेट द्वारा पार्टिशन), एवरेज_अमाउंट =एवीजी (टोटलअमाउंट) ओवर (ऑर्डरडेट द्वारा पार्टिशन), Sum_Amount =एसयूएम (कुल राशि) आदेश दिनांक द्वारा विभाजन) सरल आदेश से

प्रति ग्राहक विंडो (विभाजन) के लिए रनिंग टोटल प्राप्त करना

प्रति दिनांक विंडो के रनिंग टोटल की तरह, हम ऑर्डर सेट (टेबल) को छोटे ग्राहकों के सबसेट (विभाजन) में विभाजित करके प्रति ग्राहक विंडो में रनिंग टोटल की गणना भी कर सकते हैं:

--कुल ऑर्डर प्राप्त करना, न्यूनतम राशि, अधिकतम राशि, औसत राशि और सभी राशियों का प्रति ग्राहक विंडो (ग्राहक द्वारा विभाजन) चुनें ग्राहक का नाम, CAST (आदेश दिनांक के अनुसार) ऑर्डर दिनांक के रूप में, गणना =COUNT (*) ओवर ( ग्राहक के नाम से विभाजन), न्यूनतम राशि =मिन (कुल राशि) से अधिक (ग्राहक नाम से विभाजन), अधिकतम राशि =अधिकतम (कुल राशि) से अधिक (ग्राहक नाम से विभाजन), औसत_राशि =औसत (कुल राशि) से अधिक (ग्राहक के नाम से विभाजन), योग राशि =योग (कुल राशि) ओवर (ग्राहक नाम द्वारा विभाजन) काउंट डीईएससी, ऑर्डरडेट द्वारा सिंपलऑर्डर ऑर्डर से

स्लाइडिंग एग्रीगेशन

स्लाइडिंग एग्रीगेशन वे एग्रीगेशन हैं जिन्हें विंडो के भीतर फ़्रेम पर लागू किया जा सकता है, जिसका अर्थ है विंडो (विभाजन) के भीतर दायरे को और कम करना।

दूसरे शब्दों में, रनिंग टोटल हमें एक टेबल के भीतर बनाई गई पूरी विंडो (सबसेट) के लिए टोटल (योग, एवरेज, मिन, मैक्स, काउंट) देते हैं, जबकि स्लाइडिंग टोटल हमें टोटल (योग, एवरेज, मिन, मैक्स, काउंट) देते हैं। तालिका के विंडो (सबसेट) के भीतर फ्रेम (सबसेट का सबसेट) के लिए।

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

पंक्तियों का उपयोग <संख्या> आदेश के साथ पहले से OVER() क्लॉज के अंदर

स्लाइडिंग एग्रीगेशन को ROWS <पंक्तियों की संख्या> PRECEEDING को ऑर्डर बाय (पार्टीशन बाय के बाद) जोड़कर लागू किया जा सकता है, जबकि ROWS PRECEEDING विंडो के भीतर Frame का दायरा निर्धारित करते हैं।

उदाहरण के लिए, यदि हम प्रत्येक ग्राहक के लिए एक समय में केवल दो पंक्तियों के लिए डेटा एकत्र करना चाहते हैं तो हमें ऑर्डर तालिका में निम्नानुसार स्लाइडिंग एकत्रीकरण लागू करने की आवश्यकता है:

-- न्यूनतम राशि, अधिकतम राशि, औसत राशि प्रति फ्रेम प्रति ग्राहक विंडो प्राप्त करना ग्राहक का नाम, न्यूनतम_अमाउंट =न्यूनतम (कुल राशि) ओवर (ग्राहक नाम द्वारा विभाजन ऑर्डर दिनांक पंक्तियों 1 से पहले का आदेश), अधिकतम राशि =अधिकतम (कुल राशि) से अधिक (विभाजन) ग्राहक नाम द्वारा आदेश द्वारा आदेश दिनांक पंक्तियों 1 पूर्ववर्ती), औसत_राशि =औसत (कुल राशि) अधिक (ग्राहक नाम द्वारा विभाजन आदेश दिनांक पंक्तियों 1 पूर्ववर्ती द्वारा आदेश) सरल आदेश से ग्राहक नाम द्वारा आदेश 

यह समझने के लिए कि यह कैसे काम करता है, आइए हम फ़्रेम और विंडो के संदर्भ में मूल तालिका देखें:

ग्राहक पीटर विंडो की पहली पंक्ति में, उसने 30.50 की राशि वाला एक ऑर्डर दिया क्योंकि यह ग्राहक विंडो के भीतर फ़्रेम की शुरुआत है, इसलिए न्यूनतम और अधिकतम समान हैं क्योंकि तुलना करने के लिए कोई पिछली पंक्ति नहीं है।

इसके बाद, न्यूनतम राशि वही रहती है लेकिन अधिकतम 100.50 हो जाती है क्योंकि पिछली पंक्ति (पहली पंक्ति) राशि 30.50 है और यह पंक्ति राशि 100.50 है, इसलिए दोनों की अधिकतम राशि 100.50 है।

इसके बाद, तीसरी पंक्ति में जाने पर, दूसरी पंक्ति के साथ तुलना की जाएगी, इसलिए दोनों की न्यूनतम राशि 50.00 है और दो पंक्तियों की अधिकतम राशि 100.50 है।

एमडीएक्स साल दर साल (YTD) फंक्शन और रनिंग एग्रीगेशन

MDX एक बहुआयामी अभिव्यक्ति भाषा है जिसका उपयोग बहुआयामी डेटा (जैसे क्यूब) को क्वेरी करने के लिए किया जाता है और इसका उपयोग व्यावसायिक खुफिया (BI) समाधानों में किया जाता है।

https://docs.microsoft.com/en-us/sql/mdx/ytd-mdx के अनुसार, MDX में ईयर टू डेट (YTD) फ़ंक्शन उसी तरह काम करता है जैसे कि रनिंग या स्लाइडिंग एग्रीगेशन काम करता है। उदाहरण के लिए, YTD अक्सर आपूर्ति किए गए बिना किसी पैरामीटर के संयोजन में उपयोग किया जाता है, जो आज तक चल रहा है।

इसका मतलब है कि यदि हम इस फ़ंक्शन को वर्ष पर लागू करते हैं तो यह पूरे वर्ष का डेटा देता है, लेकिन अगर हम मार्च तक ड्रिल करते हैं तो यह हमें वर्ष की शुरुआत से लेकर मार्च तक के सभी योग देगा।

यह SSRS रिपोर्ट में बहुत उपयोगी है।

करने के लिए चीज़ें

इतना ही! आप इस लेख को पढ़ने के बाद कुछ बुनियादी डेटा विश्लेषण करने के लिए तैयार हैं और आप निम्नलिखित चीजों से अपने कौशल में और सुधार कर सकते हैं:

  1. कृपया कुल राशि जैसे अन्य कॉलम पर विंडो बनाकर एक रनिंग एग्रीगेट स्क्रिप्ट लिखने का प्रयास करें।
  2. कृपया कुल राशि जैसे अन्य स्तंभों पर फ़्रेम बनाकर एक स्लाइडिंग एग्रीगेट स्क्रिप्ट लिखने का भी प्रयास करें।
  3. अन्य एकत्रीकरण संयोजनों को आज़माने के लिए आप तालिका में अधिक कॉलम और रिकॉर्ड जोड़ सकते हैं (या इससे भी अधिक तालिकाएँ)।
  4. इस आलेख में उल्लिखित उदाहरण स्क्रिप्ट को डाटासेट के पीछे SSRS रिपोर्ट में उपयोग करने के लिए संग्रहीत कार्यविधियों में बदला जा सकता है।

संदर्भ:

  • वर्ष (एमडीएक्स)
  • SQL सर्वर के लिए dbForge स्टूडियो

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अपनी डेटाबेस होस्टिंग लागत कम करना:DigitalOcean बनाम AWS बनाम Azure

  2. SQL डेटा नियंत्रण भाषा

  3. डेटाबेस अनुकूलन:अनुक्रमणिका

  4. Azure गैप को पाटना:प्रबंधित उदाहरण

  5. वर्डप्रेस – परदे के पीछे, भाग 2