मैं इस ओरेकल परिणामसेट को पंक्ति प्राथमिकता के अनुसार मूल्यों में कैसे संकुचित कर सकता हूं, नल को अनदेखा कर रहा हूं?

जितना संभव हो सके समस्या को सरल बना दूंगा:

मेरे पास एक ऑरैकल टेबल है:

row_priority, col1, col2, col3
0, .1, 100, {null}
12, {null}, {null}, 3
24, .2, {null}, {null}

वांछित परिणाम:

col1, col2, col3
.2, 100, 3

तो पंक्ति की प्राथमिकता के अनुसार, यदि दिया गया तो यह पिछले पंक्ति मानों को ओवरराइड करता है।

मैं टेबल पर विश्लेषणात्मक कार्यों का उपयोग करके समाधान करने का प्रयास कर रहा हूं, लेकिन यह सिर्फ व्यवहार नहीं कर रहा है ...

मैं कोशिश करूँगा:

select last_value(col1 ignore nulls) over() col1,
       last_value(col2 ignore nulls) over() col2,
       last_value(col3 ignore nulls) over() col3
from (select * from THE_TABLE order by row_priority)
where rownum = 1

या उलटा:

select first_value(col1 ignore nulls) over() col1,
       first_value(col2 ignore nulls) over() col2,
       first_value(col3 ignore nulls) over() col3
from (select * from THE_TABLE order by row_priority desc)
where rownum = 1

और न तो नल को अनदेखा करना प्रतीत होता है। कोई संकेत?

0

3 उत्तर

एक विकल्प:

SELECT
  MAX(col1) KEEP (DENSE_RANK LAST ORDER BY row_priority),
  MAX(col2) KEEP (DENSE_RANK LAST ORDER BY row_priority),
  MAX(col3) KEEP (DENSE_RANK LAST ORDER BY row_priority)
FROM the_table

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

0
जोड़ा

COALESCE फ़ंक्शन यहां आपकी सहायता कर सकता है। शायद पसंद है ...

select first_value(coalesce(col1,0) ignore nulls) over() col1,
       first_value(coalesce(col2,0) ignore nulls) over() col2,
       first_value(coalesce(col3,0) ignore nulls) over() col3
from THE_TABLE
0
जोड़ा
क्या वह 0 के साथ नल की जगह नहीं बदलेगा? मैं जो कुछ भी ढूंढ रहा हूं वह नहीं!
जोड़ा लेखक TheSoftwareJedi, स्रोत
शांत, Beavis। मैंने लिखा है कि यह आपकी मदद कर सकता है ... बस एक विचार। आप शून्य के बारे में एक अच्छा मुद्दा बनाते हैं।
जोड़ा लेखक Alan, स्रोत

आपको विश्लेषणात्मक क्वेरी के बाहर rownum = 1 डालना होगा

SELECT  *
FROM    (   select          last_value(col1 ignore nulls) over() col1,
                            last_value(col2 ignore nulls) over() col2,
                            last_value(col3 ignore nulls) over() col3
            from (select * from THE_TABLE ORDER BY ROW_PRIORITY)
        )
WHERE   ROWNUM = 1

जिसके परिणामस्वरूप (उपरोक्त आपके मानों का उपयोग करके):

COL1   COL2    COL3
------ ------- ----
0.2    100     3
0
जोड़ा
मैं विभाजन खंड में आदेश देने के बारे में असहमत हूं, हालांकि मैं योजना देखना चाहता हूं। मेरे परिणाम पहले से ही आदेश दिए गए हैं, और मैं दस्तावेजी कार्यक्षमता का लाभ उठा रहा हूं। मैं नहीं चाहता कि यह इसे 3 बार पुन: व्यवस्थित करे।
जोड़ा लेखक TheSoftwareJedi, स्रोत
एनालिटिक्स के साथ ऑर्डर करने की प्रकृति के बारे में मैंने एक अतिरिक्त चर्चा देखी: stackoverflow.com/questions/262278/… । जबकि आपके संपादन इस मामले में काम करते हैं, आपको अभी भी विभाजन खंड के भीतर आदेश देना चाहिए।
जोड़ा लेखक ScottCher, स्रोत