मैं SQL सर्वर 2016 का उपयोग कर रहा हूं और मेरे द्वारा उपयोग किए जा रहे डेटा का निम्न रूप है।
CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1));
INSERT INTO #tab VALUES
('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL),
('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL);
SELECT *
FROM #tab;
मैं स्तंभों पर अंतिम गैर-शून्य मान प्राप्त करना चाहूंगा val1
और इसके val2
द्वारा cat
आदेश दिया जाएगा t
। जो परिणाम मैं चाह रहा हूं वह है
cat val1 val2 A 1 P B 10 C
सबसे नज़दीकी मैं उपयोग कर रहा हूँ LAST_VALUE
, ORDER BY
जिसकी अनदेखी करते हुए मैं काम नहीं कर रहा हूँ क्योंकि मुझे अंतिम गैर-शून्य मूल्य के ऑर्डर की आवश्यकता है।
SELECT DISTINCT
cat,
LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1,
LAST_VALUE(val2) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val2
FROM #tab
cat val1 val2 A NULL NULL B 10 NULL
वास्तविक तालिका में cat
अंतिम गैर-शून्य मान का चयन करने के लिए और अधिक कॉलम (दिनांक और स्ट्रिंग कॉलम) और अधिक वैल कॉलम (दिनांक, स्ट्रिंग और संख्या स्तंभ) हैं।
किसी भी विचार यह कैसे चयन करने के लिए।
t
मान दोहराते हैं। यह अच्छी तरह से व्यवहार डेटा नहीं है।
PARTITION BY cat ORDER BY t, id
उदाहरण के लिए। अन्यथा, एक ही क्वेरी (कोई भी क्वेरी) आपको अलग-अलग निष्पादन पर अलग-अलग परिणाम दे सकती है। यदि तालिका में कॉलम केवल वही हैं जो आप दिखाते हैं, तो मैं यह नहीं देखता कि हमारे पास हालांकि एक निर्धारित आदेश कैसे हो सकता है!
cat
आदेश दिया गया हैt
।