आप अपने विश्लेषणात्मक कार्य में ऑर्डर करने के लिए कई शर्तें निर्दिष्ट कर सकते हैं
SELECT *
FROM (SELECT id,
col1,
col2,
col3,
dense_rank() over (partition by id
order by (case when col1 = 'xyz'
then 1
else 0
end) desc,
col2 asc,
col3 asc) rnk
FROM your_table)
WHERE rnk = 1
मैं मान रहा हूँ कि आप dense_rank
want चाहते हैं यह देखते हुए कि आपने dense_rank
. का उपयोग किया है उपनाम। आप इस बारे में बात नहीं करते हैं कि आप संबंधों को कैसे संभालना चाहते हैं या क्या संबंध संभव हैं, इसलिए यह प्रश्न से ही स्पष्ट नहीं है कि आप rank
का उपयोग करना चाहते हैं या नहीं , dense_rank
, या row_number
विश्लेषणात्मक कार्य। यदि आप केवल उच्चतम रैंकिंग पंक्ति प्रति id
. प्राप्त कर रहे हैं , rank
और dense_rank
समान व्यवहार करेगा और पहले स्थान के लिए संबंध होने पर कई पंक्तियों को वापस कर देगा। row_number
मनमाने ढंग से टाई तोड़कर हमेशा एक पंक्ति लौटाएगा। यदि आप प्रति id
. के लिए पहली पंक्ति के अलावा अन्य पंक्तियाँ लाना चाहते हैं , तो आपको संबंधों के बारे में सोचना होगा और आपको rank
. से अलग व्यवहार मिलेगा और dense_rank
. अगर पहली पंक्ति के लिए दो पंक्तियाँ बंधी हैं, dense_rank
तीसरी पंक्ति को एक rnk
असाइन करेगा 2 का, जबकि rank
इसे एक rnk
असाइन करेगा 3.
ऐसा लगता है कि यह आपके द्वारा पोस्ट किए गए नमूना डेटा के लिए काम करता है
SQL> ed
Wrote file afiedt.buf
1 with x as (
2 select 1 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
3 select 1 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, 'A' col3 from dual union all
4 select 2 id, 'abc' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
5 select 2 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
6 select 3 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
7 select 3 id, 'xyz' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
8 select 4 id, 'abc' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
9 select 4 id, 'xyz' col1, to_date('01/01/2012', 'MM/DD/YYYY') col2, null col3 from dual union all
10 select 4 id, 'xyz' col1, to_date('01/02/2012', 'MM/DD/YYYY') col2, null col3 from dual
11 )
12 SELECT *
13 FROM (SELECT id,
14 col1,
15 col2,
16 col3,
17 dense_rank() over (partition by id
18 order by (case when col1 = 'xyz'
19 then 1
20 else 0
21 end) desc,
22 col2 asc,
23 col3 asc) rnk
24 FROM x)
25* WHERE rnk = 1
SQL> /
ID COL COL2 C RNK
---------- --- --------- - ----------
1 abc 01-JAN-12 A 1
2 abc 01-JAN-12 1
3 xyz 01-JAN-12 1
4 xyz 01-JAN-12 1