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

SQL क्वेरी समय के साथ लापता अंतराल को भरने और अंतिम गैर-शून्य मान प्राप्त करने के लिए

मैंने एक SQL Fiddle बनाया है आपके साथ खेलने के लिए इस समाधान का।

अनिवार्य रूप से यह एक कार्य तालिका @Months बनाता है और फिर क्रॉस आपके डेटा सेट में सभी वर्षों में शामिल हो जाता है। यह सभी वर्षों के लिए सभी महीनों की पूरी सूची तैयार करता है। फिर मैंने आपके उदाहरण में प्रदान किए गए टेस्ट डेटा में शामिल होना छोड़ दिया (टेस्ट नाम की तालिका - स्कीमा के लिए एसक्यूएल फिडल देखें) इस सूची में वापस मुझे उन महीनों के मूल्यों के साथ एक पूरी सूची देने के लिए। अगला मुद्दा पिछले महीनों के मूल्यों का उपयोग कर रहा था यदि इस महीने में कोई मूल्य नहीं था। उसके लिए, मैंने एक सहसंबद्ध उप-क्वेरी का उपयोग किया यानी tblValues ​​​​में केवल तभी शामिल हो गया जब यह एक पंक्ति के अधिकतम रैंक से मेल खाता हो, जिसका मूल्य हो। यह तब एक संपूर्ण परिणाम सेट देता है!

अगर आप साल/माह के हिसाब से फ़िल्टर करना चाहते हैं, तो आप इसे अंतिम ऑर्डर बाय के ठीक पहले WHERE क्लॉज़ में जोड़ सकते हैं।

आनंद लें!

टेस्ट स्कीमा

CREATE TABLE TEST( Month tinyint, Year int, Value int)

INSERT INTO TEST(Month, Year, Value)
VALUES
   (1,2013,100),
   (4,2013,101),
   (8,2013,102),
   (2,2014,103),
   (4,2014,104)

क्वेरी

DECLARE @Months Table(Month tinyint)
Insert into @Months(Month)Values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);


With tblValues as (
  select Rank() Over (ORDER BY y.Year, m.Month) as [Rank], 
          m.Month, 
          y.Year, 
          t.Value
  from @Months m
  CROSS JOIN ( Select Distinct Year from Test ) y
  LEFT JOIN Test t on t.Month = m.Month and t.Year = y.Year
  )
Select t.Month, t.Year, COALESCE(t.Value, t1.Value) as Value
from tblValues t
left join tblValues t1 on t1.Rank = (
            Select Max(tmax.Rank)
            From tblValues tmax 
            Where tmax.Rank < t.Rank AND tmax.Value is not null)

Order by t.Year, t.Month



  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. SQL सर्वर प्रतीक्षा ईवेंट -2

  3. NULL मानों को बाहर रखा गया है। क्यों?

  4. SQL Server 2008 R2 में कुशल पेजिनेशन

  5. टीएसक्यूएल में चल रहे कुल का अधिकतम मूल्य प्राप्त करने का प्रदर्शनकारी तरीका