2011-03-29 9 views
8

मैंने ओरेकल के साथ एक जटिल SQL क्वेरी लिखा है जिसमें मैं एक ही विभाजन पर दो विश्लेषणात्मक फ़ंक्शन का उपयोग करना चाहता हूं।ओरेकल विश्लेषणात्मक कार्य - खंड द्वारा किसी पक्ष का पुन: उपयोग कैसे करें?

के बहुत ज्यादा काफी सरल लेकिन नहीं हो:

SELECT col1, 
     MAX(col2) OVER(PARTITION BY col3, col4, col5, col6, 
            CASE WHEN col7 LIKE 'foo' 
             THEN SUBSTR(col7,1,5) 
             ELSE col7 
            END 
            ORDER BY col5 ASC, col6 DESC), 
     MIN(col2) OVER(PARTITION BY col3, col4, col5, col6, 
            CASE WHEN col7 LIKE 'foo' 
             THEN SUBSTR(col7,1,5) 
             ELSE col7 
            END 
            ORDER BY col5 ASC, col6 DESC) 
    FROM my_table; 

वहाँ PARTITION BY खंड बाँटे के लिए एक और अधिक सुरुचिपूर्ण वाक्य रचना है?

धन्यवाद।

+0

ध्यान में रखते हुए कि आप जिन फ़ंक्शंस का उपयोग कर रहे हैं वे 'MAX' और' MIN' हैं और 'col5' और 'col6'' विभाजन' में हैं और 'ऑर्डर बाय' हैं, प्रत्येक कॉलम के लिए 'ऑर्डर बाय' क्लॉज दिखाई देता है अनावश्यक होना –

+0

आप सही हैं लेकिन यह एक साधारण उदाहरण के रूप में था, यह LAST_VALUE या कोई अन्य विश्लेषणात्मक हो सकता है। – Benoit

+0

संभावित डुप्लिकेट [उसी विभाजन पर एकाधिक विंडो फ़ंक्शंस को लागू करना] (http://stackoverflow.com/questions/1896102/applying-multiple- विन्डो- फ़ंक्शन-ऑन- समान- विभाजन)। यह डुप्लिकेट ढूंढना आसान नहीं था। – Benoit

उत्तर

12

आप इस तरह मानक खिड़की खंड की बात कर रहे हैं:

SELECT col1, 
     MAX(col2) OVER(w), 
     MIN(col2) OVER(w) 
FROM my_table 
WINDOW w AS (PARTITION BY col3, col4, col5, col6, 
           CASE WHEN col7 LIKE 'foo' 
            THEN SUBSTR(col7,1,5) 
            ELSE col7 
           END 
           ORDER BY col5 ASC, col6 DESC); 

तो मेरा मानना ​​है कि इस सवाल का जवाब कोई है, ओरेकल इस का समर्थन नहीं करता (11gR2 के साथ की जाँच)।

+0

यही वही था जो मैं चाहता था! धन्यवाद। – Benoit

+0

@ बेनोइट: लेकिन दुर्भाग्यवश यह ** ** ** ओरेकल में काम नहीं करता है! –

+0

मैंने अभी देखा है कि इसका उपयोग करने की कोशिश कर रहा है। बहुत बुरा। – Benoit

5

आप सबक्वेरी फैक्टरिंग, भी रूप में जाना जाता का उपयोग कर सकते के साथ-खंड:

(untested)

with t as 
(select col1 
     , col2 
     , col3 
     , col4 
     , col5 
     , col6 
     , case col7 
     when 'foo' then 
      substr(col7,1,5) 
     else 
      col7 
     end col7 
    from my_table 
) 
select col1 
    , max(col2) over (partition by col3,col4,col5,col6,col7 order by col5,col6 desc) 
    , min(col2) over (partition by col3,col4,col5,col6,col7 order by col5,col6 desc) 
    from t 

सादर,
रोब।

+0

हां, लेकिन फिर भी यह थोड़ा लंबा है। हालांकि 'साथ' का सुझाव देने के लिए +1 जो ओरेकल में एक अच्छा कीवर्ड है। – Benoit

+0

आप "टी टी *, [केस एक्सप्रेशन] को mytable टी से new_col7 के रूप में" खंड के साथ खंड को छोटा कर सकते हैं और क्वेरी में new_col7 का उपयोग कर सकते हैं। –

+0

फिर भी, यह वास्तव में रूट समस्या का समाधान नहीं करेगा: आपके कोड में आप अभी भी '(विभाजन ... ...' भाग दोहराते हैं! – Benoit